Symfony Doctrine排除持久化实体

时间:2016-01-08 16:48:48

标签: php symfony doctrine-orm doctrine

我有一个实体Key(不是真名,我知道Key是被禁止的)我需要在循环中获得Key state=1,并将其更改为state=2。这是我的剧本:

        /* Each object */
        for ($i=0; $i < $order->getQuantity(); $i++) {

            /* get available key */
            $key = $this->getDoctrine()->getRepository('AppBundle:Key')->findOneBy(array('state' => 1));

                $key->setState(2); // On la rend active
                $this->_em()->persist($key);
            }
        }

我的问题在于这一行:$key = $this->getDoctrine()->getRepository('AppBundle:Key')->findOneBy(array('state' => 1));

Doctrine始终使用state=1获得相同的第一个键。如果我直接在循环中冲洗它没关系,但我可以有一个非常大的循环,我不想冲洗XXXX次。

有没有办法不获得已经存在的实体?如果我还没有坚持,我怎么能向Doctrine说Key with state=1

谢谢!

3 个答案:

答案 0 :(得分:3)

你为什么不这样做:

$keys = $this->getDoctrine()->getRepository('AppBundle:Key')->findBy(array('state' => 1));
foreach($keys as $key) {
    $key->setState(2);
    $this->_em()->persist($key);
}
$this->_em()->flush();

因此,每个密钥只会被持久化一次,因为持久性事物是symfony逻辑,只有在flush函数期间只有一个DB写操作,其中所有持久化项都将被存储

答案 1 :(得分:0)

除了检索和循环实体之外,您还可以使用DQL(除非我遗漏了您的问题的上下文,否则会排除这种情况。)

例如:

$dql    = 'UPDATE AppBundle:Key k SET k.state = 2 WHERE k.state = 1';
$query  = $this->_em->createQuery($dql);
$result = $query->getResult();

这显然未经测试。自从我编写DQL以来已经有一段时间了,所以你可能想查阅文档。希望这会有所帮助:)

答案 2 :(得分:0)

坚持意味着“嘿主义,让我们知道那个实体实例!”。

当你创建一个新的实体实例($key = new Key();),然后你希望Doctrine知道它($em->persist($key);)以便能够添加一个时,它就被使用(你肯定已经知道了)数据库中关于flush($em->flush())的新记录。

使用Doctrine检索的所有实体实例都已保留(Doctrine已经知道它们)。

因此,在您的代码中,persist调用无效。由于您没有刷新,因此数据库不会更新 然后,在下一个循环中,当您从数据库(->findOneBy(...))请求时,您将再次获得相同的实体实例,state仍然等于1。

最后,回答你的问题“有没有办法不让已经存在的实体?如果我不这样做,怎么能对Doctrine说Key with state=1 已坚持?“:

不,这根本不可能。