【问题标题】:Doctrine query builder wrong results教义查询生成器错误的结果
【发布时间】:2017-06-12 14:47:20
【问题描述】:

我刚刚遇到了一件非常烦人的事情。我有一个 queryBuilder :

$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:这似乎是我的应用程序特有的继承问题。再次感谢您帮助我。

【问题讨论】:

  • 你做过的sql查询是什么?
  • 这是因为leftJoins。如果您仔细查看 db 查询结果,您会发现包含 a 的行多次出现,而连接的内容不同。尝试将GROUP BY a.id 添加到您的本机 sql 查询中(这将消除大量数据,但应该归结为 192 个结果,因为来自 a 的每个条目只会显示一次)。
  • 感谢您的回复。我发现了一些可能会导致某些事情的东西。当我执行 sql count() 查询时,我得到 203 个结果。但是当我执行 getResult() 和 php count() 时,我得到 192。这真的很奇怪,实际上我有点迷路了。

标签: symfony doctrine-orm


【解决方案1】:

对此最可能的答案是,您没有得到 529 个对象,而是 529 行,其中构建了 192 个对象(因为左连接)。

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

如果没有,您能否发布您的查询结果?

【讨论】:

  • 感谢您的回复。当我向查询添加 distinct 时,我得到相同的结果。但是,如果我只在我的查询构建器中保留选择和添加,或者如果我按 a.id 分组,我会得到更接近的结果。原始查询返回 203 个结果,带或不带不同,查询生成器坚持 192。这是原始查询:gist.github.com/TristanPerchec/4cf6e70787bd6a7017d301a3e3ce830b
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多