我设置了以下关系:
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);
相关文档是here,但他们没有提及附加到一对多的ONE方面。它甚至可能吗? (我觉得应该是这样)
答案 0 :(得分:25)
听起来您只想将新的评论对象添加到页面的评论集中 - 您可以使用基本的集合添加方法轻松完成:
$page = new Page;
$comment = new Comment;
$page->comments->add($comment);
答案 1 :(得分:8)
你无法做到,因为没有要链接的ID。
首先,您需要保存父($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();
答案 2 :(得分:4)
根据Benubird的说法,我只想添加一些东西,因为我今天偶然发现了这个:
你可以像Benubird这样的集合调用add方法。 为了考虑edpaaz(额外的解雇查询)的问题,我做了这个:
$collection = $page->comments()->getEager(); // Will return the eager collection
$collection->add($comment) // Add comment to collection
据我所知,这将阻止额外的查询,因为我们只使用关系对象。
在我的情况下,其中一个实体是持久的,而第一个(在您的案例页面中)不是(并且要创建)。由于我必须处理一些事情并希望以对象方式处理它,我想将持久化实体对象添加到非持久性实体对象中。同样应该同时使用非持久性。
感谢Benubird指出我正确的方向。希望我的补充能帮助某人,就像它为我做的那样。
请记住,这是我的第一篇stackoverflow帖子,所以请稍微关注一下你的反馈。