2015-03-02 3 views
3

Я предположил, что doctrine2 оптимизирует мой запрос, чтобы обеспечить лучшую производительность для любых транзакций базы данных.Doctrine2 - множественная вставка в одном запросе

Я вставлял около 500 записей в таблицу базы данных, и я заметил, что он создал 500 + запрос для вставки записей (один запрос на запись), мне интересно, почему бы доктрине не использовать несколько вставок чтобы вставить всю запись за один снимок, не уменьшит ли это нагрузку и не оптимизирует запрос? я что-то упустил из-за этого поведения из доктрины?

Вот код, я использую для вставки:

$content = json_decode($response->getBody()); 
$em = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default'); 
foreach ($content as $value) { 
    $log = new log(); 
    $log->fromArray($value); 
    $em->persist($log); 
} 
$em->flush(); 

Update1:
Вот содержание fromArray() в соответствии с просьбой, цель этой функции заключается в основном консолидации значений в классе свойство из массива:

/** 
* Map parameters with class property. 
* 
* @param $array array 
* @access public 
* @return $this 
*/ 
public function fromArray(array $array) 
{ 
    foreach ($array as $property => $value) { 
     $method = 'set'.ucwords($property); 
     $this->$method($value); 
    } 
    return $this; 
} 

Вот содержание $content:

Array 
(
    [0] => stdClass Object 
    (
     [id] => 111 
     [guid] => aaaa-bbbb-cccc 
     [wid] => 100 
     [pid] => 101 
     [start] => 2014-11-22T12:44:44+00:00 
     [stop] => 2014-11-22T15:23:11+00:00 
     [duration] => 9507 
     [description] => Log description 
     [tags] => Array 
      (
       [0] => test 
      ) 
     [at] => 2014-11-24T07:28:09+00:00 
     [uid] => 51 
    ) 
    [1] => stdClass Object 
    (
     [id] => 112 
     [guid] => dddd-eee 
     [wid] => 100 
     [pid] => 101 
     [billable] => 
     [start] => 2014-11-22T15:35:07+00:00 
     [stop] => 2014-11-22T15:45:21+00:00 
     [duration] => 614 
     [description] => Lorem description 
     [tags] => Array 
      (
       [0] => php 
       [1] => pm 
      ) 
     [at] => 2014-11-24T04:35:30+00:00 
     [uid] => 51 
    ) 
) 
+0

Doctrine не обрабатывает ваш запрос магическим способом, он делает все, что вы просите. Вы упорствуете в foreach (это правда, как я вижу), и, вероятно, есть больше записей, чем 500. Вы должны решить это, прежде чем отправлять данные для сохранения метода, я имею в виду, что вы должны использовать лучший способ денормализации – ilhnctn

+0

@ İlhanÇetinm благодарит вас за ответ , так как я понимаю, что здесь нет магии, разве это не основная задача оптимизации запросов? поскольку это метод ввода по умолчанию, это заставляет меня задаться вопросом, разрешает ли Doctrine даже массовое вложение? –

+0

@ İlhanÇetin Я не уверен, правильно ли я слежу за вами, оцените, если вы можете показать пример. –

ответ

2

См. Документ this. На каждой итерации Doctrine создает для вас один запрос insert ..., в конце концов, когда вы вызываете flush(), Doctrine отправляет все эти вставки в db за один раз внутри цикла (используя такой механизм, как foreach(queries as query) { run->query.. }) В вашем случае любой из этих запросов вставляет, поэтому, как я сказал в комментарии, в вашем случае нет ненормальной ситуации. ORM может не подходить для всех случаев.

+0

Вопрос в том, почему Doctrine создает один запрос на вставку на итерацию, почему он не использует множественную вставку? –

+0

, пожалуйста, взгляните на документ, который я связал. Ответ дается под интересным классом для привлечения внимания. – ilhnctn

Смежные вопросы