Красноречивые отношения - приложите (но не сохраняйте) к Многим

У меня установлены следующие отношения:

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, поэтому, пожалуйста, оставьте свои отзывы с небольшим беспокойством.