2010-10-23 1 views
2

В моем приложении у меня есть цикл, который выполняется около 1000 раз, внутри него я создаю объект и сохраняю его. Это часть приложения, где я заполняю свою базу данных данными. Обычно это выглядит так:multi insert in kohana orm3

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

Это производит 1000 запросов INSERT. Можно ли каким-то образом сделать кохану производить несколько вставок. Разделите это на 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

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);