2016-04-09 1 views
2

Ist es möglich, die Ergebnisse einer Eloquent-Abfrage durch die eifrig geladenen Daten zu bestellen. Um klar zu sein, bekomme ich die richtigen Daten, es ist paginiert richtig und funktioniert in jeder Hinsicht, außer es ist nicht so angeordnet, wie ich es brauche. In diesem Fall möchte ich Benutzer nach profile.firstname sortieren.Laravel 5.2 Eloquent Order-Abfrage durch eifrig geladene Daten

Etwas wie folgt aus:

$results = User::where('id', '!=', $user->id) 
       ->whereNotIn('id', $ids) 
       ->with([ 
        'profile' => function ($query) { 
         $query->addSelect(['id', 'first_name', 'last_name']); 
        }, 
       ]) 
       ->orderBy('profile.first_name', 'desc') 
       ->paginate(); 

Die Daten werden in einer ionischen Anwendung verwendet wird und für eine unendliche Schriftrolle verwendet, so muss ich die Daten in dem Format haben, unten von first_name bestellt, bevor sie auf die empfangene Client, aber das obige Beispiel funktioniert nicht.

DATA benötigt für Ionic Ansicht

user: { 
    id: '1', 
    username: 'aUsername' 
    email: 'anEmail' 
    profile: { 
    id: '2', 
    user_id: '1', 
    first_name: 'aFirstName', 
    last_name: 'aLastName', 
    phone_number: '999-999-9999' 
    } 
} 
... 

Solution (mit abgeflachter Ergebnismenge)

$results = User::join('user_profiles', 'users.id', '=', 'user_profiles.user_id') 
       ->select('users.id', 'users.username', 'user_profiles.first_name', 'user_profiles.last_name') 
       ->where('users.id', '!=', $user->id) 
       ->whereNotIn('id', $existingContactIds) 
       ->where('users.username', 'like', $request->input('username') . '%') 
       ->orderBy('user_profiles.first_name') 
       ->paginate(); 

Solution (mit der richtigen Ergebnisformat)

$results = User::where('users.id', '!=', $user->id) 
        ->whereNotIn('users.id', $existingContactIds) 
        ->where('users.username', 'like', $request->input('username') . '%') 
        ->with([ 
         'profile' => function ($query) use ($columns) { 
          $query->addSelect('user_profiles.first_name', 'user_profiles.last_name'); 
         }, 
        ]) 
        ->select('users.id', 'users.username') 
        ->join('user_profiles', 'users.id', '=', 'user_profiles.user_id') 
        ->orderBy('user_profiles.first_name') 
        ->paginate(); 
+0

Könnten Sie teilen Template-Code entspricht? –

+0

Um die Paginierung zu unterstützen, müssen Sie bestimmte Parameter in Ihrem Abfrage-Generator behandeln (wie Limit und Offset). –

+0

Hallo, ich habe keine Probleme mit Paginierung, nur wie das Ergebnis bestellt wird – mtpultz

Antwort

1

Für die Bestellung von einem anderen Tisch sein soll, müssen Sie eine Verknüpfung auszuführen.

Kette in einem für Ihr Profil Tisch sitzt

-> join('profiles', 'profiles.id', '=', 'users.profile_id') 

Sie werden dann zu orderBy first_name fähig sein (wenn auch nicht profile.first_name).

Es ist nicht möglich, durch eifrig geladene Tabellen zu bestellen. Wenn Sie sich das SQL-Laravel-Programm ansehen, werden Sie sehen, dass es zuerst alle Ergebnisse aus den Benutzertabellen abruft und dann die IDs nur der Ergebnisse (also eine Teilmenge aller Ergebnisse, wenn Sie die Seitennummerierung verwenden) an die Profiltabelle weiterleitet um relevante Daten zu erhalten.

Sie könnten die Verknüpfung manchmal vermeiden, indem Sie die Auflistungsmethode sortBy für die Ergebnisse verwenden. Dies funktioniert jedoch nicht, wenn die Seitenauswertung funktioniert, da sortBy nur für die Ergebnisse funktioniert. Daher wird nur eine Teilmenge von Daten sortiert (aber sortBy) unterstützt die Punktnotation, die Sie für Ihre Bestellung verwendet haben (By).

+0

Hallo, danke für die Beschreibung und die Antwort, die das Problem der Bestellung definitiv gelöst hat, aber ein Problem bezüglich des Formats der JSON-Daten, die an den Client zurückgegeben werden, eingeführt. Ich habe festgestellt, dass der Abfrage-Generator keine Sammlung zurückgibt, sodass ich vor dem Aufruf von paginate() keinen Filter für die Daten ausführen kann. Wie würden Sie das jetzt abgeflachte Objekt wieder in ein Format wie das obige Beispiel bringen? Ich dachte, ich würde nur die Daten packen, die Paginierungsdaten sammeln, filtern und ersetzen, aber '$ results ['data']' 'liefert die Daten nicht, und auch nicht $ results-> data'. – mtpultz

+1

@mtpultz Es sollte immer eine Sammlung zurückgeben. Können Sie die vollständige Abfrage einfügen, die Sie jetzt verwenden? –

+0

Hallo, ich habe die Lösung in der Frage gepostet. Scheint, ein Array ähnlich Larawels Abfrage-Generator zurückzugeben. – mtpultz

0

Im Code zu sehen, und ich denke, es ->orderBy('profile->first_name', 'desc') oder versuchen, diese andere Art und Weise ->orderBy('first_name', 'desc')

0

wie dieses Versuchen $results = User::where('id', '!=', $user->id) ->whereNotIn('id', $ids) ->with([ 'profile' => function ($query) { $query->addSelect(['id', 'first_name', 'last_name']); $query->orderBy('first_name','DESC'); }, ]) ->paginate();