我有一个实体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
?
谢谢!
答案 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
已坚持?“:
不,这根本不可能。