【问题标题】:Doctrine ORM, two different querys produce the same result setDoctrine ORM,两个不同的查询产生相同的结果集
【发布时间】:2010-10-31 22:36:56
【问题描述】:

我正在使用 Doctrine 1.2 和 Symfony 1.4。

在我的操作中,我有两个不同的查询返回不同的结果集。不知何故,第二个查询似乎改变了第一个查询的结果(或参考?),我不知道为什么..

这是一个例子:

  $this->categories = Doctrine_Query::create()
       ->from('Categorie AS c')
       ->innerJoin('c.Activite AS a')
       ->where('a.archive = ?', false)
       ->execute();

  print_r($this->categories->toArray()); // Return $this->categories results, normal behavior.

  $this->evil_query = Doctrine_Query::create()
       ->from('Categorie AS c')
       ->innerJoin('c.Activite AS a')
       ->where('a.archive = ?', true)
       ->execute();

  print_r($this->categories->toArray()); // Should be the same as before, but it return $this->evil_query results instead!

为什么 Doctrine 会这样?这完全让我发疯。谢谢!

为简单起见,查询 2 似乎在劫持查询 1 结果。

【问题讨论】:

  • 你能显示结果吗?如果你存储 toArray() 的结果,而不是在 Doctrine_Collection 上调用它会发生什么?
  • jeremy:如果我存储 toArray() 的结果,一切都会按预期开始。

标签: php orm symfony1 doctrine


【解决方案1】:

在查询之间使用类似的东西($em - 实体管理器):

$em->clear(); // Detaches all objects from Doctrine!

http://docs.doctrine-project.org/en/2.0.x/reference/batch-processing.html

【讨论】:

    【解决方案2】:

    Doctrine_CollectiontoArray() 方法的API 文档中说:

    模仿$query->execute(array(), Doctrine_Core::HYDRATE_ARRAY);的结果

    我怀疑要让您满意地回答这个问题,您将不得不阅读源代码。

    【讨论】:

      【解决方案3】:

      这似乎是 $this->categories 和 $this->evil_query 指向同一个地方的问题。 $this->evil_query === $this->categories$this->evil_query == $this->categories的结果是什么?

      【讨论】:

        【解决方案4】:

        Hubert,您是否尝试过将查询存储到一个单独的变量中并然后在其上调用execute() 方法?

        我的意思是这样的:

        $good_query = Doctrine_Query::create()
          ->from('...')
          ->innerJoin('...')
          ->where('...', false)
        ;
        $evil_query = Doctrine_Query::create()
          ->from('...')
          ->innerJoin('...')
          ->where('...', true)
        ;
        $this->categories = $good_query->execute();
        $this->evil_query = $evil_query->execute();
        

        似乎两个属性(categoriesevil_query)都指向同一个对象。

        【讨论】:

          【解决方案5】:

          Erm,在两次查询之后,您 print_rfirst 查询的结果 - 将最后一行更改为 print_r($this->evil_query->toArray()); 以查看差异:)

          【讨论】:

          • 是的,我知道,问题是在调用创建“邪恶查询”之后,第一个查询的内容现在与第二个相同。
          • 公平地说,从你原来的问题来看,这不是很清楚。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-25
          • 1970-01-01
          • 2021-10-27
          • 1970-01-01
          • 1970-01-01
          • 2013-05-23
          相关资源
          最近更新 更多