我有以下使用UNION
和priority
别名列的查询:
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()
之前不会执行查询。