Я пытаюсь проверить модель перед ее сохранением. Очевидно, что если модель недействительна, ее нельзя сохранять в базе данных. Когда проверка не удалась, она выдает исключение и не продолжает сохранять. Это ниже работает:
$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([]));