Laravel:使用UNION作为一个查询的多个SELECT


Laravel: Multiple SELECTs using UNION - as one query

我有以下使用UNIONpriority别名列的查询:

SELECT id, name, 4 as priority FROM `topics`
WHERE id IN(17, 18, 19, 20, 21) AND name LIKE 'ge'
UNION
SELECT id, name, 3 as priority FROM `topics`
WHERE id IN(17, 18, 19, 20, 21) AND name LIKE '%ge%'
UNION
SELECT id, name, 2 as priority FROM `topics`
WHERE name LIKE 'ge%'
UNION
SELECT id, name, 1 as priority FROM `topics`
WHERE name LIKE '%ge%'
ORDER BY priority DESC

是否可以将其"翻译"到Laravel的查询生成器,使其保持为一个查询

我知道我可以把所有的SELECT放在单独的变量中,然后用->union()把它们链接起来,但我担心这会先执行4个查询,一个接一个,最后只合并结果。

在Laravel文档中:

查询生成器还提供了一种"联合"两个查询的快速方法一起:

$first=DB::table('users')->where Null('first_name');

$users=DB::table('users')->whereNull('last_name')->union($first)->get();这个unionAll方法也可用,并且具有相同的方法签名作为联盟。

我认为,就目前而言,这是拉拉威尔工会的唯一途径。我认为第一个查询没有得到数据,因为不要添加->get()链。

在Laravel的查询生成器中使用并集不会执行查询。union()方法期望向其传递查询生成器实例或Closure的实例。它存储在构建器实例中的联合数组中,只有在执行查询时才会合并所有组件。

例如,当调用get()时,这将只运行一个查询:

DB::table('topics')
    ->whereIn('id', [17,18,19,20,21])
    ->where('name', 'LIKE', 'ge')
    ->union(DB::table('topics')
        ->whereIn('id', [17,18,19,20,21])
        ->where('name', 'LIKE', 'ge%')
    )->get();

尝试运行DB::getQueryLog()来查看查询的实际内容。我相信Laravel在您调用->get()->first()之前不会执行查询。