【问题标题】:How to use WITH clause in Laravel Query Builder如何在 Laravel 查询生成器中使用 WITH 子句
【发布时间】:2019-10-02 05:13:18
【问题描述】:

我有 SQL 查询(见示例)。 但是我找不到如何在查询生成器中编写它的方法。 你有什么想法吗?

WITH main AS (
    SELECT id FROM table1
)
SELECT * FROM table2
WHERE 
  table2.id IN (SELECT * FROM main)

我想得到如下格式:

$latestPosts = DB::table('posts')
                   ->select('user_id', DB::raw('MAX(created_at) as last_post_created_at'))
                   ->where('is_published', true)
                   ->groupBy('user_id');

$users = DB::table('users')
        ->joinSub($latestPosts, 'latest_posts', function ($join) {
            $join->on('users.id', '=', 'latest_posts.user_id');
        })->get();

但对于 WITH

【问题讨论】:

  • 您的查询在 MySQL 中有效吗?你展示的不是一对多的关系吗?您可以使用docs 作为很好的示例。
  • 我不知道 MySQL 和 WITH 子句。我在 PostgerSQL 中使用它。当然,我真正的任务并不像例子那么简单。实际任务更复杂,但我为问题简化了它

标签: laravel postgresql eloquent common-table-expression query-builder


【解决方案1】:

查询生成器必须与多个数据库引擎(mysql、postgresql、sql lite、sql server)兼容,因此只提供对常用功能的支持。

假设您的查询返回数据,您可以使用DB:select() 方法执行raw query

$data = DB::select('WITH main AS (SELECT id FROM table1), SELECT * FROM table2 WHERE table2.id IN (SELECT * FROM main)');

DB:select 方法还接受用于使用命名绑定的第二个参数。

另外,还有一些可用的包,例如 laravel-cte,它们会将功能添加到 Eloquent/Query Builder。

【讨论】:

    【解决方案2】:

    Laravel 不支持公用表表达式。

    我已经为它创建了一个包:https://github.com/staudenmeir/laravel-cte

    你可以这样使用它:

    $query = DB::table('table1')->select('id');
    
    $result = DB::table('table2')
        ->withExpression('main', $query)
        ->whereIn('table2.id', DB::table('main')->select('id'))
        ->get();
    

    【讨论】:

    • 是的,很漂亮。非常感谢您!
    猜你喜欢
    • 2021-11-02
    • 1970-01-01
    • 2017-03-29
    • 2013-12-09
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 2021-05-05
    相关资源
    最近更新 更多