Laravel雄辩的联合查询

rot*_*rcz 5 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();
Run Code Online (Sandbox Code Playgroud)

当我先“ orderBy()”然后进行联合时,没有排序发生。

当我单独查询“ $ a”或“ $ b”时,“ orderBy()”工作正常。

当我以以下方式进行操作时,“ orderBy()”会整体发生。

$a->union($b)
    ->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))
    ->get();
Run Code Online (Sandbox Code Playgroud)

我怎样才能使'orderBy()'分别适用于每个对象,然后将结果合并回去?似乎应该可以。

编辑:如果有人可以提供一种执行此操作的方法,即使它是正常的MySQL,我也会选择您的答案作为答案,因为我认为Eloquent可能存在一个错误。

小智 17

请尝试以下操作:

$a = Model::where('code', '=', $code)
->where('col_a', '=' , 1);

$b = Model::where('code', '=', $code)->where('col_b', '=' , 1)
->union($a)
->get();

$result = $b;
Run Code Online (Sandbox Code Playgroud)

  • @Sunil对我来说,不可能合并不同数量的列。除非您将添加具有空值的选择盟友。 (2认同)
  • UNION 中的每个 SELECT 语句必须具有相同的列数。这些列还必须具有相似的数据类型。每个 SELECT 语句中的列也必须具有相同的顺序。 (2认同)

Ng *_*ong 9

Laravel 集合中的“合并”功能或许可以帮到你。
最大的不同是我提前用 ->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);
Run Code Online (Sandbox Code Playgroud)

注意:我没有你的数据,所以我无法证明它有效,但至少它适用于我的数据,所以应该值得你尝试

  • 当需要使用正确的排序顺序对合并结果进行分页时,它不起作用 (3认同)
  • 我添加了 ->get(); 到示例 $a 和 $b 的末尾。您提供的解决方案可以工作,但需要为每个解决方案访问数据库,这是我试图避免的,因为我需要多个联合,但这是目前最好的答案。 (2认同)

Jay*_*hal 7

orderBy()之后尝试申请union()

尝试这个

$a->union($b)->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))->get();
Run Code Online (Sandbox Code Playgroud)

编辑

研究并发现并准备了雄辩的查询,试试这个

$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();
Run Code Online (Sandbox Code Playgroud)

  • 我不想把它作为一个整体订购。我希望各个查询能够在其内部排序。 (2认同)