如何在 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();
我有 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();