Красноречивые отношения - приложите (но не сохраняйте) к Многим
У меня установлены следующие отношения:
class Page {
public function comments() {
return $this->hasMany('Comment');
}
}
class Comment {
public function page() {
return $this->belongsTo('Page');
}
}
Довольно стандарт болота. На одной странице может быть много комментариев, а один комментарий принадлежит одной странице.
Мне бы хотелось создать новую страницу:
$page = new Page;
и комментарий
$comment = new Comment;
и приложите комментарий к странице , не сохранив ее
$page->comments->associate($comment);
Я пробовал следующее:
// These are for one-to-many from the MANY side (eg. $comment->page->associate...)
$page->comments->associate($comment); // Call to undefined method Illuminate\Database\Eloquent\Collection::associate()
$page->comments()->associate($comment); // Call to undefined method Illuminate\Database\Query\Builder::associate()
// These 2 are for many-to-many relations, so don't work
$page->comments->attach($comment); // Call to undefined method Illuminate\Database\Eloquent\Collection::attach()
$page->comments()->attach($comment); // Call to undefined method Illuminate\Database\Query\Builder::attach()
// These 2 will (if successful) save to the DB, which I don't want
$page->comments->save($comment); // Call to undefined method Illuminate\Database\Eloquent\Collection::save()
$page->comments()->save($comment); // Integrity constraint violation: 1048 Column 'page_id' cannot be null
Самое странное, что делать обратное (прикрепление страницы к комментарию) работает правильно:
$comment->page()->associate($page);
Соответствующие документы здесь, но они не упоминают о присоединении к ОДНОЙ стороне одного-ко-многим. Возможно ли это? (Я чувствую, что это должно быть)
Ответы
Ответ 1
Похоже, вы просто хотите добавить новый объект комментариев в коллекцию комментариев к страницам - вы можете сделать это легко, используя метод добавления основного colection:
$page = new Page;
$comment = new Comment;
$page->comments->add($comment);
Ответ 2
Вы не можете сделать, так как нет ссылок для ссылок.
Итак, сначала вам нужно сохранить родителя ($page
), а затем сохранить дочернюю модель:
// $page is existing model, $comment don't need to be
$page->comments()->save($comment); // saves the comment
или наоборот, на этот раз без сохранения:
// again $page exists, $comment don't need to
$comment->page()->associate($page); // doesn't save the comment yet
$comment->save();
Ответ 3
в соответствии с Benubird Я просто хотел добавить что-то, как я наткнулся на это сегодня:
Вы можете вызвать метод add в коллекции, как указано в Benubird.
Чтобы рассмотреть проблемы edpaaz (дополнительный активированный запрос), я сделал следующее:
$collection = $page->comments()->getEager(); // Will return the eager collection
$collection->add($comment) // Add comment to collection
Насколько я вижу, это предотвратит дополнительный запрос, поскольку мы используем только объект-отношение.
В моем случае одно из объектов было постоянным, в то время как первый (на странице вашего случая) не был (и должен быть создан). Поскольку мне пришлось обработать несколько вещей и я хотел обработать это объектно, я хотел бы добавить постоянный объект сущности к неустойчивому. Должна работать и с нестойкой, и с.
Спасибо, Бенуберд, за то, что указал мне в правильном направлении. Надеюсь, что мое дополнение помогает кому-то, как это было для меня.
Пожалуйста, имейте в виду, что это мой первый пост stackoverflow, поэтому, пожалуйста, оставьте свои отзывы с небольшим беспокойством.