所以我有以下问题:
$a = Model::where('code', '=', $code)
->where('col_a', '=' , 1)
->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))
$b = Model::where('code', '=', $code)
->where('col_b', '=' , 1)
->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))
$a->union($b)->get();
当我订购时,没有发生任何排序()'先是再联合。
当我查询' $ a'或者' $ b'单独的' orderBy()'工作正常。
当我按以下方式执行时,' orderBy()'整体发生。
$a->union($b)
->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))
->get();
我怎样才能使它成为' orderBy()'单独申请,然后将结果联合起来?它似乎应该有效。
编辑:如果有人可以提供这样做的方法,即使它是正常的MySQL,我会选择你的答案,因为我认为可能存在与Eloquent的错误。答案 0 :(得分:4)
Laravel集合中的“merge”功能可能会对您有所帮助。
不同的是,我提前用 - > get()关闭查询,并使用merge()而不是union()
$a = Model::where('code', '=', $code)
->where('col_a', '=' , 1)
->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))->get();
$b = Model::where('code', '=', $code)
->where('col_b', '=' , 1)
->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))->get();
$result = $a->merge($b);
注意:我没有您的数据,因此我无法证明其有效,但它最不适用于我的数据,所以值得您尝试
答案 1 :(得分:3)
尝试在orderBy()
union()
试试这个
$a->union($b)->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))->get();
修改强>
研究并找到并准备了雄辩的查询,试试这个
$modelA = Model::where('code', '=', $code)
->where('col_a', '=' , 1)
->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))
$modelB = Model::where('code', '=', $code)
->where('col_b', '=' , 1)
->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))
$a = DB::table(DB::raw("({$modelA->toSql()}) as a"))
->mergeBindings($modelA->getQuery())
->selectRaw("a.*");
$b = DB::table(DB::raw("({$modelB->toSql()}) as b"))
->mergeBindings($modelB->getQuery())
->selectRaw("b.*");
$a->union($b)->get();
答案 2 :(得分:0)
尝试以下操作:
$a = Model::where('code', '=', $code)
->where('col_a', '=' , 1);
$b = Model::where('code', '=', $code)->where('col_b', '=' , 1)
->union($a)
->get();
$result = $b;
答案 3 :(得分:-1)
参考MySql Documentation
对单个SELECT语句使用ORDER BY并不意味着行在最终结果中出现的顺序,因为UNION默认生成一组无序行。因此,在此上下文中使用ORDER BY通常与LIMIT结合使用,因此它用于确定要为SELECT检索的所选行的子集,即使它不一定影响这些行的顺序。最终的UNION结果。如果在SELECT中没有LIMIT出现ORDER BY,它会被优化掉,因为它无论如何都不会产生任何影响。