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

Ale*_*rin 5 postgresql common-table-expression query-builder laravel eloquent

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

WITH main AS (
    SELECT id FROM table1
)
SELECT * FROM table2
WHERE 
  table2.id IN (SELECT * FROM main)
Run Code Online (Sandbox Code Playgroud)

我想获得如下格式:

$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();
Run Code Online (Sandbox Code Playgroud)

但对于WITH

Jon*_*eir 6

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();
Run Code Online (Sandbox Code Playgroud)