Doctrine orm Doctrine2-一个查询中的多个插入

Doctrine orm Doctrine2-一个查询中的多个插入,doctrine-orm,bulkinsert,Doctrine Orm,Bulkinsert,我假设doctrine2会优化我的查询,为任何数据库事务提供最佳性能 我在一个数据库表中插入了大约500条记录,我注意到它创建了500多个查询来插入记录(每个记录一个查询),我想知道,为什么不使用多个插入来一次性插入所有记录,这不会减少负载并优化查询吗?我是否从教义中遗漏了一些关于这种行为的东西 以下是我用于插入的代码: $content = json_decode($response->getBody()); $em = $this->getServiceLocator()->

我假设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();
更新1:
以下是请求的fromArray()的内容,此函数的目的基本上是将值从数组合并到class属性:

/**
 * 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
    )
)
请看一下这份文件。在每次迭代中,条令都会为您创建一个
insert…
查询,毕竟,当您调用
flush()
时,条令会在循环内一次性将所有这些insert查询发送到db(使用类似
foreach(查询为查询){run->query..}

在您的情况下,这些查询中的任何一个都是插入,因此,正如我在评论中所说的,在您的情况下没有异常情况。ORM可能并不适用于所有情况

教条不会以神奇的方式处理你的请求,它会按你的要求去做。你坚持使用foreach(我看到这是真的),可能有超过500条记录。。在将数据发送到persist方法之前,您必须解决这个问题,我的意思是您必须使用一种更好的非规范化方法@İlhanêetinm谢谢您的回复,因为我知道这里没有魔法,这不是查询优化的基础吗?由于这是默认的插入方法,这让我想知道Doctrine是否允许批量插入?@İlhanêetin我不确定我是否正确地跟踪了您,如果您能给出一些示例,我将不胜感激。您能分享
fromArray()的内容吗
如果可能的话,在pastebin中有一个
$value
的实例,或者在更新代码时有一个gist@İlhanêetin,让我知道这是否有效。问题是,为什么Doctrine每次迭代都创建一个插入查询,为什么不使用多个插入?请查看我链接的文档。答案在worning课程下给出,以吸引学生。