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

时间:2015-02-18 13:25:55

标签: php mysql laravel

我有以下查询,该查询使用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个查询,一个接一个,最后只是结合结果。

3 个答案:

答案 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()之前不会执行查询。