【问题标题】:Symfony Doctrine exclude persisted entitySymfony Doctrine 排除持久化实体
【发布时间】:2016-04-13 10:21:44
【问题描述】:

我有一个实体 Key(不是真名,我知道 Key 是被禁止的),我需要在循环中获取一个带有 state=1Key,并将其更改为 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-&gt;getDoctrine()-&gt;getRepository('AppBundle:Key')-&gt;findOneBy(array('state' =&gt; 1));

Doctrine 总是得到与state=1 相同的第一个键。如果我直接在循环中刷新没关系,但我可以有一个非常大的循环,我不想刷新 XXXX 次。

有没有办法不让已经持久化的实体?如果我还没有坚持,我怎么能对 Doctrine 说得到 Key with state=1 ONLY

谢谢!

【问题讨论】:

  • 也许我在您的示例中遗漏了一些上下文,但是为什么您要在循环中一个接一个地获取记录,而不是使用-&gt;findBy(['state' =&gt; 1]) 返回所有记录?实际上,如果您只想更新一堆记录,您可以创建一个 DQL/SQL 更新查询,可选择将其放入自定义 KeyRepository

标签: php symfony doctrine-orm doctrine


【解决方案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();

因此每个键只会被持久化一次,因为持久化事物是 symfony 的逻辑,只有你在刷新功能期间只有一个数据库写入操作,所有持久化的项目都将被存储

【讨论】:

    【解决方案2】:

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

    例如:

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

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

    【讨论】:

      【解决方案3】:

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

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

      使用 Doctrine 检索到的所有实体实例都已被持久化(Doctrine 已经知道它们)。

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

      最后,回答你的问题“有没有办法不让已经持久化的实体?如果我还没有持久化,我怎么能对 Doctrine 说得到Key with state=1 ONLY ?”:

      不,这是不可能的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-10
        • 2021-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多