原则 2:QueryBuilder 加入子查询

Posted

技术标签:

【中文标题】原则 2:QueryBuilder 加入子查询【英文标题】:Doctrine 2: QueryBuilder Join with subquery 【发布时间】:2021-07-29 13:03:15 【问题描述】:

我需要将原生查询转换为教义查询。

本机查询

select u.*, v.browser_id
from users u
left join visits v
    on u.id = v.user_id
    and v.id = (
        select max(id) from visits v2
        where v2.user_id = u.id
    )

您可以在这里看到我需要选择使用他们访问过的最新浏览器的用户

因此,要将此查询转换为 DQL,我知道我需要这样做

        $queryBuilder->leftJoin('u.visits', 'lastVis', Join::WITH,
            // ????
        );

但我不知道具体是什么。也许有人会很快解决这个问题?

【问题讨论】:

【参考方案1】:

谢谢,看来我找到了解决办法:)

        $subQuery = $this->entityManager->createQueryBuilder()
            ->select('MAX(vis2.id)')
            ->from(Visit::class, 'vis2')
            ->where('vis2.user = u.id');

        $this->entityManager->createQueryBuilder()
            ->select('u')
            ->from(User::class, 'u')
            ->leftJoin(
                'u.visits', 'vis',
                Join::WITH, sprintf('vis.id = (%s)', $subQuery->getDQL()),
            );

【讨论】:

以上是关于原则 2:QueryBuilder 加入子查询的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 6,MYSQL - 如何使用 Laravel Querybuilder 或 Model Eloquent 将子查询与 GroupBY 左连接?

beego——构造查询

如何使用 Cassandra 中的 QueryBuilder 定义具有 2 个条件的 Where 查询?

如何将这个简单的 sql 查询转换为学说 querybuilder

laravel 5.1 中 Eloquent 和 Query Builder 有啥区别?

学说:ORM QueryBuilder 或 DBAL QueryBuilder