2010-10-23 52 views
2

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

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

这会产生1000个INSERT查询。是否有可能以某种方式使kohana生产多个插页。将其分成10个插入,每个插入100个数据集。这是可能的,如果是的话,那么做法是什么?

回答

11

虽然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个插入查询。
  • $数据假定与值对应于列

感谢赛的顺序#kohana

+0

同样的问题是如何实现“插入忽略”?在添加100条记录的同时,其中一条记录可能已经存在于数据库中,如果是这样,则添加所有100条记录将被拒​​绝。 – SET 2010-10-30 23:42:19

0

PHP工作非常慢数组的数组时插入多阵列非常大(使得方法: :值有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(); 
    } 
} 
0
call_user_func_array([$query, 'values'], $data);