Laravel Eloquent Union查询

时间:2017-01-20 04:59:59

标签: php mysql laravel eloquent laravel-5.3

所以我有以下问题:

$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的错误。

4 个答案:

答案 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,它会被优化掉,因为它无论如何都不会产生任何影响。