Doctrine ORM,两个不同的查询产生相同的结果集

Posted

技术标签:

【中文标题】Doctrine ORM,两个不同的查询产生相同的结果集【英文标题】:Doctrine ORM, two different querys produce the same result set 【发布时间】: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() 的结果,一切都会按预期开始。 【参考方案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()); 以查看差异:)

【讨论】:

是的,我知道,问题是在调用创建“邪恶查询”之后,第一个查询的内容现在与第二个相同。 公平地说,从你原来的问题来看,这不是很清楚。

以上是关于Doctrine ORM,两个不同的查询产生相同的结果集的主要内容,如果未能解决你的问题,请参考以下文章

在 Repository 中使用 Doctrine 2 ORM 和 OneToOne 获得“排名”

使用 Doctrine ORM 查询当天的生日

使用 Doctrine ORM ManyToOne 关系在相反方向获取实体

使用 Doctrine ORM 的*** EXISTS 查询

Doctrine DBAL 可以与 ORM Query Builder 混合使用吗?

如何在 Doctrine ORM 查询中查找与别名相关的表?