Symfony学说排除了持久存在的实体


Symfony Doctrine exclude persisted entity

我有一个实体Key(不是真名,我知道Key是被禁止的),我需要在循环中用state=1获得一个Key,并将其更改为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));

条令总是得到与state=1相同的第一把钥匙。如果我直接在循环中刷新,那没关系,但我可以有一个很大的循环,我不想刷新XXXX次。

有没有一种方法可以不获取已持久化的实体?如果我还没有坚持,我怎么能对Doctrine说只获得Key with state=1

谢谢!

为什么不这样做:

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

因此,每个密钥只会被持久化一次,因为持久化是符号逻辑,所以在刷新函数期间只有一个DB写入操作,所有持久化的项都将存储在中

除了在实体上检索和循环外,您还可以使用DQL(除非我在您的问题中遗漏了排除这一点的上下文)。

例如:

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

这显然是未经检验的。我写DQL已经有一段时间了,所以你可能想查阅一下文档。希望这有帮助:)

Persisting的意思是"嘿,Doctrine,让我们注意那个实体实例!"。

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

使用条令检索到的所有实体实例都已持久化(条令已意识到这些实例)。

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

最后,回答您的问题"有没有办法不获得已经持久化的实体?如果我还没有持久化,我怎么能对Doctrine说只获得Key with state=1?":

不,这是不可能的。