2016-07-31 4 views
1

Это будет простой вопрос для некоторых, но я не могу найти ответ в Интернете или в документации (только его варианты, которые я не хочу).Laravel/Eloquent eager loading

  • Допустим, у нас есть Question класс
  • Каждый Question объект может необязательно иметь несколько Tag s

Я установил классы и вещи ведут себя, как ожидалось. В настоящее время я использую:

  • $questions = Question::all();

Это работает, как ожидалось, однако это не нетерпеливый нагрузки.

Чтобы быть ясным: $question->tags дает массив, который я ожидаю. Проблема отношений не существует.

Из-за новых требований я буду создавать представление, возможно, с тысячами вопросов, поэтому эта загруженная загрузка является обязательной.

я пытался использовать:

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

Который выдает сообщение об ошибке:

BadMethodCallException в Builder.php линии 2345: Вызов неопределенной метод Осветите \ Database \ Query \ Builder :: all()

Каждое учебное пособие или способ загрузки в Google, либо указывает идентификатор, либо является учебным пособием о том, как ТОЛЬКО показывать родителям с детьми.

Я просто хочу «всех и своих детей».

Это должно быть легко .. кто-нибудь знает, как это сделать?

Благодаря Rick

ответ

4

Вы должны определить метод в вашей модели. Насколько я вижу, у вас будет одно отношение. И это будет

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

класс тега

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

и контроллер. Вместо all() используйте метод get().

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

Как я определен метод tags в Question модели. Question::with('tags') должен назвать это. Вместо этого, если вы собираетесь сделать Question::with('tag'), tag метод должен быть определен в модели Question.

Обратите внимание на s

+0

Они уже определены. Это не тот шаг, с которым я столкнулся. Быть ясным. Я уже могу правильно запросить объекты. Теги $ question-> дают мне массив. Просто загружается LAZY. Я хочу обеспечить загрузку EAGER. – elb98rm

+0

'$ questions = Question :: with ('tag') -> get();' дает: 'BadMethodCallException в строке Builder.php 2345: вызов неопределенного метода Illuminate \ Database \ Query \ Builder :: tag()' – elb98rm

+1

'$ questions = Question :: with ('tags') -> get();' (это должны быть теги not tag = для имени функции внутри модели вопроса) –

0

Я пометил оба ответа, как правильно: оригинальный синтаксис предложил правильно, и вопрос имя класса поднят был последний вопрос. Спасибо всем:

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