【问题标题】:Symfony 2: LIMIT Doctrine LEFT JOINSymfony 2:LIMIT Doctrine LEFT JOIN
【发布时间】:2020-12-24 01:45:43
【问题描述】:

我对 Symfony 2.7 中的左连接学说有疑问。

示例代码:

public function test($id, $offset, $limit)
{
    $build = $this->createQueryBuilder('building');
    $build
        ->addSelect('users', 'numbers')
        ->join('building.users', 'users')
        // limit the numbers for 1 result!
        ->leftJoin('building.numbers', 'numbers') // only select 1 result instead of more.
        ->where('building.id = :id')
        ->setParameter('id', $id);

    $paginator = new Paginator($build->getQuery(), $fetchJoinCollection = true);
    $result = $paginator->getQuery()
        ->setFirstResult($offset)
        ->setMaxResults($limit)
        ->getResult();

    return $result;
}

我现在的问题是我们如何实现 ->leftJoin('building.numbers', 'numbers') 只返回 MAX 1 个结果。

谢谢!

Doctrine orm:2.2.3,Symfony 版本:2.7

【问题讨论】:

  • “选择 1 个结果而不是更多”是什么意思?来自numbers 的任何条目都可以,或者是否有任何应考虑的顺序?
  • 我想将结果从数字限制为 1。@AlanT。
  • 所以任何来自数字的条目都可以,您只想将结果集限制为单个条目?
  • 是的,没关系,只需要单个条目@AlanT。
  • 是什么样的联想? ManyToOneNumber 实体所有?

标签: php symfony doctrine-orm pagination doctrine-query


【解决方案1】:

如果您并不真正关心检索到的具体数字,而只想获得一个,则可以使用GROUP BY 子句,使用拥有buildingsnumbers 之间关联的列。允许这样做的基本查询生成器如下所示:

$qb = $this->createQueryBuilder('building')
    ->addSelect('numbers')
    ->leftJoin('building.numbers', 'numbers')
    ->groupBy('numbers.building');

注意:如果您使用默认水合模式并检索对象,您的 numbers 集合将只有一个条目(或没有),即使实际上有更多条目。如果您尝试基于那些部分水合的集合执行更新,这可能会产生一些问题。

【讨论】:

  • 分组错误:7 错误:列“b0_.start_date”必须出现在 GROUP BY 子句中或用于聚合函数第 1 行:SELECT CASE WHEN b0_.start_date IS NULL THEN b0_.created_d。 ..
  • 这是与您帮助我解决的其他问题结合使用时出现的错误。你知道如何解决这个问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多