我整天都在尝试如何雄辩地进行查询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();
有什么方法可以雄辩地创建相同的选择?
答案 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 unionAll
与union
具有相同的签名。
我希望对您有帮助