2016-07-31 23 views
1

Dies wird eine einfache Frage für einige sein, aber ich kann nicht scheinen, die Antwort online oder in der Dokumentation zu finden (nur Varianten davon, die ich nicht will).Laravel/Eloquent eifrig laden

  • Können sagen, wir haben eine Question Klasse
  • Jedes Question Objekt optional mehrere Tag s haben können

ich die Klassen eingerichtet haben und die Dinge verhalten sich wie erwartet. Derzeit verwende ich:

  • $questions = Question::all();

Dies funktioniert wie erwartet, aber es nicht eifrig Last.

Um klar zu sein: $question->tags gibt das Array ich erwarte. Es gibt kein Beziehungsproblem.

Aufgrund neuer Anforderungen werde ich eine Ansicht mit möglicherweise Tausenden von Fragen erstellen, so dass dieses eifrige Laden ein Muss ist.

ich versucht zu nutzen:

  • $questions = Question::with('tag')->all();

Welche Nachricht gibt Fehler:

BadMethodCallException in Builder.php Linie 2345: undefinierte Methode Illuminate \ Database \ Query-Aufruf \ Builder :: all()

Jedes Tutorial, oder wie ich Google Eager laden, gibt entweder eine ID an, ODER ist ein Tutorial, wie man NUR Eltern mit Kindern zeigt.

Ich möchte einfach "alle und ihre Kinder".

Das muss einfach sein ... weiß jemand, wie es geht?

Dank Rick

Antwort

4

Sie sollten die Methode in Ihrem Modell definieren. Soweit ich sehe, werden Sie eine Beziehung von eins zu viele haben. Und das wird

class Question extends Model 
{ 
    public function tags() 
    { 
     return $this->hasMany('App\Tag'); 
    } 
} 

Tag Klasse

class Tag extends Model 
{ 
    public function question() 
    { 
     return $this->belongsTo('App\Question'); 
    } 
} 

und die Steuerung sein. Verwenden Sie anstelle von all()get() Methode.

$questions = Question::with('tags')->get(); 

Wie ich tags Methode im Question Modell definiert. Question::with('tags') sollte es anrufen. Stattdessen sollten Sie , tag Methode in Question Modell definiert werden.

Beachten Sie die s

+0

Diese bereits definiert sind. Dies ist nicht der Schritt, mit dem ich ein Problem habe. Um klar zu sein .. kann ich schon von den Objekten abfragen. $ question-> tags gibt mir ein Array .. es ist nur, dass es LAZY geladen ist. Ich möchte eine EAGER-Last erzwingen. – elb98rm

+0

'$ fragen = Frage :: mit ('tag') -> get();' gibt: 'BadMethodCallException in Builder.php Zeile 2345: Aufruf zu undefinierte Methode Illuminate \ Database \ Query \ Builder :: tag()' – elb98rm

+1

'$ questions = Question :: with ('tags') -> get();' (es sollten Tags nicht tag = zum Funktionsnamen im Question-Modell sein) –

0

ich beide Antworten als richtig markiert haben: die ursprüngliche Syntax vorgeschlagen korrekt ist, und der Klassenname aufgeworfene Frage die letzte Ausgabe war. Dank all:

$questions = Question::with('tags')->get();

Verwandte Themen