如何在 Laravel 查询生成器中使用 WITH 子句

How to use WITH clause in Laravel Query Builder

我有 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、postgresql、sql lite、sql 服务器),因此仅支持常用功能。

假设您查询 returns 数据,您可以使用 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。

Laravel 没有对常见 table 表达式的原生支持。

我已经为它创建了一个包: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();