2016-05-24 12 views
0

Ich habe viele individuelle Modelle und ich möchte sie alle kombinieren, um die Vorteile von eifrigloading nutzen.Wie man mehrere individuelle eloquente Modelle als eine in Laravel und Eager Load Relation kombinieren kann

$match_query = "select * from feeds " . 
       "WHERE (user_id IN ($users_size)) " . 
       "OR (target_id IN ($slugs_size) AND feedable_type = 'review') " . 
       "ORDER BY created_at DESC LIMIT 5;"; 

//Query works fine and return 2 results 
$results = DB::select($match_query, $consolidatedArray); 

    //to convert returned php standard obj to array 
    $results = json_decode(json_encode($results), True); 

    $all = []; 

    foreach($results as $result){ 
     $x = new \App\Feed($result); 

     //I am able to get relation like this for single item 
     // $x->user; 

     $all[] = $x; 
    } 

    //but this thing is not working (i am trying to eager load) 
    $data = $all->with('user'); 

bekomme ich folgende Fehler

ErrorException in FeedsRepository.php line 67: 
Trying to get property of non-object 

Was ist die Lösung?

+0

Warum Sie den DB-Klasse verwenden? Warum verwenden Sie nicht die erforderliche eloquente Klasse, zB 'SomeEloquenModel :: mit ('user') -> get();' – Steve

+0

meine Abfrage ist zu kompliziert. Lemme fügen das auch in den Code ... – Eirtaza

+0

Ich sehe es nicht so kompliziert ... Wie auch immer, es funktioniert nicht, da Sie die 'with()' Methode für ein Array aufrufen, nicht für die Elemente innerhalb es. – phaberest

Antwort

0

$ alles ist ein Array. Array ist kein Objekt. Wenn Sie also $ all-> with() aufrufen, erhalten Sie eine Fehlermeldung "Versuch, die Eigenschaft eines Nicht-Objekts zu erhalten". Ziemlich einfach :).

Ihr Code scheint unnötig verschachtelt zu sein. Ihre Abfrage ist in Eloquent und Query Builder nicht schwierig. Lies ein bisschen Dokumentation und nutze die tollen Funktionen, anstatt dich hier zu hacken.

Sie Code könnte mit diesem viel besser lesbar Schnipsel (oder so ähnlich) ersetzt werden:

$results = Feed::whereIn('user_id', $users_size) 
      ->orWhere(function($q) use($slugs_size) { 
       $q->whereIn('target_id', $slugs_size)->orWhere('feedable_type', 'review'); 
      }) 
      ->with('user') 
      ->orderBy('created_at', 'desc')->take(5)->get(); 

Die wichtige Sache zu erinnern ist hier, dass eloquent auch die ganze Kraft von Query Builder Packs. In den meisten Fällen ist es einfacher zu lesen und zu warten als vollständige SQL-Abfragen.

Lesematerial:

https://laravel.com/docs/master/eloquent

https://laravel.com/docs/master/queries

+0

Es funktioniert ... musste nur ersetzen oder wo mit neuen Feedable_Type – Eirtaza

+0

korrigieren @Eirtaza die orWhere in der Schließung sollte ein wo für ein 'und' sein. – lagbox

+0

Nun eine andere Frage, die zu diesem http://stackoverflow.com/questions/37415347/eager-loading-only-few-relations-in-laravel-de-pending-upon-morphto verlinkt – Eirtaza

Verwandte Themen