我有一个实体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
?":
不,这是不可能的。