2017-06-12 58 views
2

我刚刚遇到了一件非常烦人的事情。我有一个查询生成器:原则查询生成器错误结果

$queryBuilder 
    ->select('a') 
    ->addSelect('am') 
    ->addSelect('m') 
    ->addSelect('c') 
    ->addSelect('t') 
    ->leftJoin('a.articleMedias', 'am') 
    ->leftJoin('am.media', 'm') 
    ->leftJoin('a.categories', 'c') 
    ->leftJoin('a.translations', 't') 
    ->add('where', $queryBuilder->expr()->in('a.site', $ids)) 
; 

当我得到的结果,我得到192个对象。 问题是,当我转储SQL并直接执行到数据库,我得到529对象。但这是相同的查询!

有人知道造成这两个结果之间的差距的原因?

编辑:发现了一些东西。当我做一个计数查询时,我得到了203个结果,但是当我做一个正常的结果并计算结果时,我得到了192个结果。这是否意味着教条有最大变异或什么?

编辑2:它似乎是特定于我的应用程序的继承问题。再次感谢您的帮助。

+0

什么是SQL查询,你都做了些什么? –

+1

这是因为leftJoins的。如果在数据库查询密切关注结果你会发现有多行含有'a'的行多次出现,而连接的内容不同。试着在你的本地sql查询中添加一个'GROUP BY a.id' (这将消除大量的数据,但它应该降低到192个结果,因为每个输入项只会显示一次)。 – Joe

+0

感谢您的回复。我发现了一些可能导致某些事情的东西。当我做一个SQL计数()查询我得到203结果。但是当我做一个getResult()和一个PHP计数()时,我得到了192.这真的很奇怪,我实际上有点迷茫。 –

回答

2

对此的最可能的答案是,您没有获得529个对象,但其中529行包含192个对象(因为左连接)。

直接把查询时到数据库,你必须计算SQL的唯一的(或在条款:DISTINCT行的对象的根据您的ID列更改您转储到SELECT DISTINCT <you_primary_key_column>, <rest of your query>查询这个结果应该给你192它匹配您的192个对象行。

如果没有,请您发表您的结果查询?

+0

感谢您的回复。当我添加不同的查询时,我得到了相同的结果。但是,如果我只保留选择和添加我的查询生成器或如果我通过a.id我分组得到更接近的结果。原始查询会返回203个结果(有或没有独立查询),并且查询生成器将粘贴到192.以下是原始查询:https://gist.github.com/TristanPerchec/4cf6e70787bd6a7017d301a3e3ce830b –