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_Collection
中toArray()
方法的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();
似乎两个属性(categories
和 evil_query
)都指向同一个对象。
【讨论】:
【参考方案5】:Erm,在两次查询之后,您 print_r
是 first 查询的结果 - 将最后一行更改为 print_r($this->evil_query->toArray());
以查看差异:)
【讨论】:
是的,我知道,问题是在调用创建“邪恶查询”之后,第一个查询的内容现在与第二个相同。 公平地说,从你原来的问题来看,这不是很清楚。以上是关于Doctrine ORM,两个不同的查询产生相同的结果集的主要内容,如果未能解决你的问题,请参考以下文章
在 Repository 中使用 Doctrine 2 ORM 和 OneToOne 获得“排名”
使用 Doctrine ORM ManyToOne 关系在相反方向获取实体
使用 Doctrine ORM 的*** EXISTS 查询