我该如何在雄辩的laravel中使用别名创建SQL查询?

时间:2019-02-25 01:00:55

标签: mysql laravel-5 eloquent

我整天都在尝试如何雄辩地进行查询sql。我知道我可以根据需要使用raw,但是我很好奇有什么办法吗?

我的原始sql是:

SELECT *
FROM (
    SELECT 1 as own, id, up_date , top_list_end_date FROM advertisements WHERE top_list_end_date > now()
    UNION ALL
    SELECT 2 as own, id, up_date, top_list_end_date FROM advertisements  WHERE top_list_end_date IS NULL
) a
ORDER BY own, up_date desc

在Laravel中,我正在尝试:

$groupA = $adv->where('top_list_end_date', '>', Carbon::now());
$groupA->select('*')
        ->selectSub(function ($query) {
            $query->selectRaw('1');
        }, 'own');

$groupB = $restAdv->whereNull('top_list_end_date');
$groupB->select('*')
        ->selectSub(function ($query) {
            $query->selectRaw('2');
        }, 'own');

$result = $groupA->unionAll($groupB);

$result->orderBy('own', 'desc')->orderBy('up_date', 'desc')->get();

有什么方法可以雄辩地创建相同的选择?

2 个答案:

答案 0 :(得分:0)

如果要在laravel中使用SQL查询。您可以使用

之类的查询构建器
end

DB::raw();

如果要使用带别名的SQL查询,只需这样编写即可。

DB::select();

希望此答案对您有所帮助。

好运:)

答案 1 :(得分:0)

雄辩的方式将是这样的:

$first = DB::table('advertisements')
            ->select(DB::raw('"1" AS own'), 'id', 'up_date', 'top_list_end_date')
            ->whereRaw('top_list_end_date > NOW()')

$advertisements = DB::table('advertisements')
            ->select(DB::raw('"2" AS own'), 'id', 'up_date', 'top_list_end_date')
            ->whereNull('top_list_end_date')
            ->unionAll($first)
            ->orderBy('own', 'DESC')
            ->orderBy('up_date', 'DESC')
            ->get();

作为参考,请参阅here

Laravel unionAllunion具有相同的签名。

我希望对您有帮助