kohana orm3中的多插入

Posted

技术标签:

【中文标题】kohana orm3中的多插入【英文标题】:multi insert in kohana orm3 【发布时间】:2011-04-29 11:57:29 【问题描述】:

在我的应用程序中,我有一个执行大约 1000 次的循环,在其中我正在创建对象并保存它。这是我用数据填充数据库的应用程序的一部分。通常这看起来像这样:

foreach(...)
    ...
    try
        $object = new Model_Whatever;
        $object->whatever=$whatever;
        $object->save();
    catch(Exception $e)
    ...

                    

这会产生 1000 个 INSERT 查询。是否有可能以某种方式让 kohana 生产多刀片。将其拆分为 10 个插入,每个插入 100 个数据集。是否有可能,如果可以,这样做的方法是什么?

【问题讨论】:

【参考方案1】:

虽然 Kohana ORM 不支持多插入,但您仍然可以使用查询构建器,如下所示:

$query = DB::insert('tablename', array('column1', 'column2','column3'));
foreach ($data as $d) 
    $query->values($d);

try 
    $result = $query->execute();
 catch ( Database_Exception $e )    
        echo $e->getMessage();

您仍然需要拆分数据,这样上述内容就不会尝试执行包含 1000 次插入的查询。 $data 假定一个数组数组,其值对应于列的顺序

在#kohana 中感谢以赛亚

【讨论】:

还有一个问题是如何实现“插入忽略”?添加 100 条记录时,其中一条可能已存在于数据库中,如果存在,则拒绝添加所有 100 条记录。【参考方案2】:

当插入非常大的多数组时,php 工作非常慢(因此方法 ::values 具有 array_merge)所以更快:

class Database_Query_Builder_Bath_Insert 
    extends Database_Query_Builder_Insert

    public static function doExecute($table, $data) 
        $insertQuery = DB::insert($table, array_keys(current($data)));

        $insertQuery->_values = $data;

        $insertQuery->execute();
    

【讨论】:

【参考方案3】:
call_user_func_array([$query, 'values'], $data);

【讨论】:

以上是关于kohana orm3中的多插入的主要内容,如果未能解决你的问题,请参考以下文章

Kohana 3 ORM检索最后一个插入ID

Kohana 中的全局视图变量

kohana .htaccess 中的 AllowOverride ALL 是啥意思?

Kohana 3 ORM 中的嵌套关​​系

无法访问 Kohana 控制器中的会话变量

Kohana 3 ORM 模型中的 ORWHERE 等价物