我有以下查询,该查询使用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个查询,一个接一个,最后只是结合结果。
答案 0 :(得分:3)
在Laravel文档中:
查询构建器还提供了一种快速的方式来实现" union"两个问题 一起:
$ first = DB :: table(' users') - > whereNull(' first_name');
$ users = DB:表('用户') - > whereNull('姓氏') - >工会($第一) - >获得();该 unionAll方法也可用,并且具有相同的方法签名 作为工会。
我认为,目前,这是Laravel工会的唯一途径。我认为第一个查询无法获取数据,因为不要添加 - > get()链。
答案 1 :(得分:1)
在Laravel的查询构建器中使用union不会执行查询。期望union()
方法将查询构建器实例传递给它或Closure
的实例。它存储在构建器实例中的union数组中,并且只有在执行查询时才会将所有组件部分组合在一起。
例如,只有在调用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();
答案 2 :(得分:0)
尝试运行DB::getQueryLog()
以查看查询实际是什么。我想相信Laravel在您致电->get()
或->first()
之前不会执行查询。