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

时间:2010-10-31 22:36:56

标签: php orm symfony1 doctrine

我正在使用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结果。

5 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

toArray()中的Doctrine_Collection方法的API文档中,它说:

  

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

的结果

我怀疑你满意地回答这个问题,你将不得不通过源代码。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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)都指向同一个对象。

答案 4 :(得分:-1)

嗯,在您print_r查询第一个查询的结果后 - 将最后一行更改为print_r($this->evil_query->toArray());以查看差异:)