批量“替换成"用于 CodeIgniter 活动记录 [英] batch "replace into" for CodeIgniter Active Record

查看:57
本文介绍了批量“替换成"用于 CodeIgniter 活动记录的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

CodeIgniter 提供了一个很棒的批量更新函数,叫做 update_batch()

CodeIgniter offers a great function to update in batch called update_batch()

http://www.codeigniter.com/user_guide/database/query_builder.html?highlight=update_batch#CI_DB_query_builder::update_batch

它还提供了一个函数replace()来执行replace into mysql 查询

It also offers a function replace() to execute replace into mysql queries

http://www.codeigniter.com/user_guide/database/query_builder.html?highlight=replace#CI_DB_query_builder::replace

有什么方法可以使用 replace_batch() 或类似的东西吗?我正在使用内部带有替换的循环,但认为函数会更好

Is there any way to have something like replace_batch() or equivalent? I am using a loop with a replace inside, but figured a function would be better

推荐答案

如果你想克隆 我的仓库 我已经实施了.我尝试将解决方案放入主分支,但似乎 narfbg 是坚定的反对.也许社区的更多参与可以使其实施.

If you want to clone my repository I have implemented. I tried to get the solution into the main branch but it seems like narfbg is adamantly against it. Maybe some more participation from the community could get it implemented.

/**
 * Replace_Batch
 *
 * Compiles batch insert strings replacing any existing rows and runs the queries
 *
 * @param   string  $table  Table to replace insert into
 * @param   array   $set    An associative array of insert values
 * @param   bool    $escape Whether to escape values and identifiers
 * @return  int Number of rows inserted or FALSE on failure
 */
public function replace_batch($table, $set = NULL, $escape = NULL, $batch_size = 100)
{
    if ($set === NULL)
    {
        if (empty($this->qb_set))
        {
            return ($this->db_debug) ? $this->display_error('db_must_use_set') : FALSE;
        }
    }
    else
    {
        if (empty($set))
        {
            return ($this->db_debug) ? $this->display_error('replace_batch() called with no data') : FALSE;
        }

        $this->set_insert_batch($set, '', $escape);
    }

    if (strlen($table) === 0)
    {
        if ( ! isset($this->qb_from[0]))
        {
            return ($this->db_debug) ? $this->display_error('db_must_set_table') : FALSE;
        }

        $table = $this->qb_from[0];
    }

    // Batch this baby
    $affected_rows = 0;
    for ($i = 0, $total = count($this->qb_set); $i < $total; $i += $batch_size)
    {
        if ($this->query($this->_replace_batch($this->protect_identifiers($table, TRUE, $escape, FALSE), $this->qb_keys, array_slice($this->qb_set, $i, $batch_size))))
        {
            $affected_rows += $this->affected_rows();
        }
    }

    $this->_reset_write();
    return $affected_rows;
}

// --------------------------------------------------------------------

/**
 * Replace batch statement
 *
 * Generates a platform-specific insert string from the supplied data.
 *
 * @param   string  $table  Table name
 * @param   array   $keys   INSERT keys
 * @param   array   $values INSERT values
 * @return  string
 */
protected function _replace_batch($table, $keys, $values)
{
    return 'REPLACE INTO '.$table.' ('.implode(', ', $keys).') VALUES '.implode(', ', $values);
}

以上是与 Github 上完全相同的代码,因此该解决方案可索引回 stackoverflow.com.但不幸的是,我对 stackoverflow 的回复仅限于 30k 个字符,因此我无法粘贴整个提交,其中还包括对数据库驱动程序的更改.

Above is the exact same code as on Github just so the solution is indexable back to stackoverflow.com. But unfortunately my reply on stackoverflow is limited to 30k characters so I cannot paste in the entire commit which also includes changes to db drivers.

这篇关于批量“替换成"用于 CodeIgniter 活动记录的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆