2017-11-30 1 views
2

Ich benutze Laravel Eloquent, um die Datenbank zweimal zu treffen. Ich füge die Ergebnisse der 2 Abfragen in eins zusammen. Wie kann ich dies zu einer einzigen Abfrage machen, so dass es nur einmal die Datenbank trifft?Wie kann ich diese Abfrage kombinieren?

$openers = Comments::select('id', 'parent_id', 'opener_id', 'topic', 'username', 'comment', 'upvotes', 'created_at', 'updated_at', 'deleted_at') 
    ->where('topic', '=', $topic) 
    ->where('parent_id', '=', 0) 
    ->orderBy('id') 
    ->orderBy('updated_at', 'desc') 
    ->get(); 

$replies = Comments::select('id', 'parent_id', 'opener_id', 'topic', 'username', 'comment', 'upvotes', 'created_at', 'updated_at', 'deleted_at') 
    ->where('topic', '=', $topic) 
    ->where('parent_id', '!=', 0) 
    ->orderBy('parent_id') 
    ->orderBy('updated_at', 'desc') 
    ->get(); 

$comments = $openers->merge($replies); 

Grundsätzlich würde ich die Zeilen mit parent_id mag: 0 von id und die Zeilen sortiert werden, wo die parent_id nicht 0 von parent_id sortiert werden, aber nicht von id.

Antwort

1

entfernen Zustand (parent_id = 0, parent_id! = 0) und bedingte Bestellung hinzufügen, indem Sie alle Kommentare zu sortieren und dann alle Antworten, Ein weiter, um durch Kommentare von id und Antworten von parent_id zu sortieren

$results = Comments::select(
    'id', 'parent_id', 'opener_id', 'topic', 'username', 'comment', 'upvotes', 'created_at', 'updated_at', 'deleted_at', 
    DB::raw("CASE WHEN parent_id = 0 THEN 'Comments' ELSE 'Replies' END as comment_type") 
) 
    ->where('topic', '=', $topic) 
    ->orderByRaw('parent_id = 0 DESC') 
    ->orderByRaw('CASE WHEN parent_id = 0 THEN id ELSE parent_id END ASC') 
    ->orderBy('updated_at', 'desc') 
    ->get(); 
+1

Das funktioniert großartig. Vielen Dank. – rotaercz

0

Ich weiß, dass Sie etwas anderes herausgefunden haben, denn in der Basisabfrage können Sie Ihr Problem bereits erhalten.

Sample query

oder wenn Sie wollen einige komplexe Abfrage aber Ihr mit Problem zu tun, wie es über ORM-Methode zu tun. Sie können einen Trick mit dem Modell erstellen, indem Sie eine "VIEW" -Tabelle in Ihrer Datenbank erstellen und dann die komplexe Abfrage in dieser VIEW mit denselben Spalten in Ihrer Tabelle ausführen oder auch eine Spalte hinzufügen/entfernen! :)

Sie so etwas wie dies tun können,

in der SQL-Datenbank

CREATE VIEW `sample_database`.`view_comment` AS 
SELECT *, (SELECT some_field FROM other_table) as extra_field FROM comment 
WHERE (some_field = 'SOME_CONDITION_ONLY') AND 
some_date BETWEEN 'FROM_DATE' AND 'END_DATE' 

dann in Ihrem Php Laravel Code, können Sie ein 'ViewComment' Modell erstellen, dann können Sie eine Abfrage tun so etwas noch immer.

ViewComment::where('some_field','YOUR_CONDITION')->get(); //or 
ViewComment::paginate(10);