Laravel получает построитель вместо отношения

Я пытаюсь проверить модель перед ее сохранением. Очевидно, что если модель недействительна, ее нельзя сохранять в базе данных. Когда проверка не удалась, она выдает исключение и не продолжает сохранять. Это ниже работает:

$question = new Question([...]); $question->validate(); $question->save(); 

У меня проблема с answers() hasMany. В соответствии с этим ответом я должен был бы называть add() для объекта отношения:

 $question = new Question([...]); $question->answers()->add(new Answer([...])); $question->validate(); $question->save(); 

Вышеизложенное не выполнено:

 Call to undefined method Illuminate\Database\Query\Builder::add() 

Я думал, что функция answers () вернет объект отношений HasMany, но похоже, что вместо этого я получаю построитель. Зачем?

answer answers() возвращает объект HasMany. Однако, поскольку на объекте HasMany не существует метода HasMany , Laravel прибегает к __call магии __call PHP.

 public function __call($method, $parameters) { $result = call_user_func_array([$this->query, $method], $parameters); if ($result === $this->query) { return $this; } return $result; } 

Метод __call получает экземпляр запроса и пытается вызвать метод add на нем. Однако нет метода add в построителе запросов, поэтому вы получаете это сообщение.

Наконец, метод add является частью Eloquent Collection Laravel, а не частью HasMany. Чтобы получить класс Collection, вам нужно отбросить скобки (как показано в ответе, указанном в вашей ссылке) и сделать это вместо этого:

 $question->answers->add(new Answer([...])); 

Нет метода add . Используйте метод save :

 $question->answers()->save(new Answer([]));