Laravel Eloquent Union-Abfrage

Lesezeit: 4 Minuten

Howards Benutzer-Avatar
Howard

Also ich habe folgende Abfrage:

$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();

Es findet keine Sortierung statt, wenn ich zuerst ‘orderBy()’ und dann union.

Wenn ich ‘$a’ oder ‘$b’ einzeln abfrage, funktioniert ‘orderBy()’ einwandfrei.

Wenn ich es auf folgende Weise mache, passiert ‘orderBy()’ als Ganzes.

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

Wie kann ich es so machen, dass ‘orderBy()’ für jeden einzeln gilt und dann die Ergebnisse wieder zusammenführen? Es scheint, als sollte es funktionieren.

BEARBEITEN: Wenn jemand eine Möglichkeit dazu bieten kann, auch wenn es sich um normales MySQL handelt, werde ich Ihre als Antwort auswählen, da ich denke, dass Eloquent möglicherweise einen Fehler aufweist.

  • Warum es „nicht geht“. Was ist der Fehler oder die Ausgabe

    – Gayan

    20. Januar 2017 um 5:06 Uhr

  • Es gibt keinen Fehler. Es scheint einfach nicht die orderBy-Sortierung anzuwenden.

    – Howard

    20. Januar 2017 um 5:07 Uhr

  • Es ist keine Eloquent-Sache, es ist eine MySQL-Sache. Siehe „Followup“ in der akzeptierten Antwort hier: stackoverflow.com/questions/24683766/…. Grundsätzlich gilt: ORDER BY wird in UNIONs nicht berücksichtigt und kann sogar von der MySQL-Version abhängig sein.

    – zmippie

    12. April 2017 um 9:12 Uhr

Benutzeravatar von Max Roa
Max Roa

Versuche Folgendes:

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

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

$result = $b;

  • Aber falls beide Tabellen unterschiedliche Spaltenzahlen haben, gibt es einen Fehler. Gibt es eine Möglichkeit, UNION in Eloquent mit diff-Spaltentabellen zu verwenden?

    – Sunil Paclangia

    20. Dezember 2019 um 15:29 Uhr

  • @Sunil Für mich ist es unmöglich, eine unterschiedliche Anzahl von Spalten zu vereinen. es sei denn, Sie fügen ausgewählte Verbündete mit Nullwert hinzu.

    – AbingPj

    20. August 2020 um 9:46 Uhr

  • Jede SELECT-Anweisung innerhalb von UNION muss die gleiche Anzahl von Spalten haben. Die Spalten müssen auch ähnliche Datentypen haben. Die Spalten in jeder SELECT-Anweisung müssen ebenfalls in derselben Reihenfolge sein.

    – Fahad Scheich

    18. Februar 2021 um 18:45 Uhr

Benutzeravatar von Jaymin Panchal
Jaymin Panchal

Versuchen Sie einfach, sich zu bewerben orderBy() nach union()

Versuche dies

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

BEARBEITEN

Recherchiert und gefunden und eloquente Abfrage vorbereitet, einfach mal ausprobieren

$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();

  • Ich möchte nicht, dass es als Ganzes bestellt wird. Ich möchte, dass die einzelnen Abfragen in sich geordnet werden.

    – Howard

    20. Januar 2017 um 5:12 Uhr

  • können Sie das Ergebnis ohne Union und mit Union posten, um mehr über die Probleme zu erfahren

    – Jaymin Panchal

    20. Januar 2017 um 5:21 Uhr


  • Es wäre schwierig, weil ich die Abfrage für die Frage vereinfacht habe. Grundsätzlich findet keine Sortierung statt, wenn ich zuerst orderBy() und dann union verwende. Wenn ich sie einzeln mache, funktioniert orderBy() einwandfrei. Wenn ich es auf der Grundlage der von Ihnen geposteten Antwort mache, geschieht orderBy() als Ganzes.

    – Howard

    20. Januar 2017 um 5:29 Uhr


  • Ich denke, das könnte ein Laravel-Bug sein. Ich habe den Fehler auf github gepostet. Hoffentlich wird es bald gelöst.

    – Howard

    20. Januar 2017 um 5:42 Uhr

  • @PrafullaKumarSahu Überprüfe jetzt.

    – Howard

    20. Januar 2017 um 5:48 Uhr

Der “verschmelzen” Funktion in der Laravel-Sammlung kann Ihnen möglicherweise helfen.
Der große Unterschied ist, dass ich die Abfrage vorher mit ->get() abschließe und merge() statt union() verwende.

$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);

Hinweis: Ich habe Ihre Daten nicht, daher kann ich nicht beweisen, dass es funktioniert, aber es funktioniert zumindest mit meinen Daten, also sollte es einen Versuch wert sein

  • Ich habe ->get(); bis zum Ende Ihrer Beispiele $a und $b. Die Lösung, die Sie bereitgestellt haben, funktioniert, erfordert jedoch das Aufrufen der Datenbank für jede einzelne, was ich zu vermeiden versuche, da ich mehrere Gewerkschaften benötige, aber dies ist derzeit die beste Antwort.

    – Howard

    20. Januar 2017 um 23:14 Uhr


  • Es funktioniert nicht, wenn das zusammengeführte Ergebnis mit der richtigen Sortierreihenfolge paginiert werden muss

    – Alexey Tsinya

    25. Oktober 2018 um 15:53 ​​Uhr

  • Ich habe dies getan, um mit datatable result $a->union($b)->get(); [Add get(); after union is applied]

    – Disha Goyal

    28. Oktober 2022 um 10:16 Uhr

1444700cookie-checkLaravel Eloquent Union-Abfrage

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy