Laravel 有说服力的关系——重视(但不要吝啬)有很多
我已建立以下关系:Laravel 有说服力的关系——重视(但不要吝啬)有很多,laravel,laravel-4,eloquent,relationship,Laravel,Laravel 4,Eloquent,Relationship,我已建立以下关系: class Page { public function comments() { return $this->hasMany('Comment'); } } class Comment { public function page() { return $this->belongsTo('Page'); } } 相当沼泽的标准。一个页面可以有多个注释,一个注释属于一个页面 我希望能够创建一个新页
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);
相关的文档是,但它们没有提到附加到一对多的一侧。有可能吗?(我觉得应该是这样)您不能这样做,因为没有可链接的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();
听起来您只是想将新的comment对象添加到页面的comments集合中-您可以使用基本的colection add方法轻松完成此操作:
$page = new Page;
$comment = new Comment;
$page->comments->add($comment);
根据贝努伯德的说法,我只是想在今天无意中补充一些东西: 您可以对像Benubird这样的集合调用add方法。 为了考虑EdPaAZ(额外的激发查询)的关注,我这样做了:
$collection = $page->comments()->getEager(); // Will return the eager collection
$collection->add($comment) // Add comment to collection
据我所知,这将阻止额外的查询,因为我们只使用关系对象
在我的例子中,其中一个实体是持久的,而第一个实体(在您的案例页面中)不是(并且要创建)。由于我必须处理一些事情,并希望以对象的方式处理这些事情,所以我希望将持久实体对象添加到非持久实体对象中。不过,这两种方法都应该适用于非持久性
感谢贝努伯德为我指明了正确的方向。希望我的加入能像帮助我一样帮助别人
请记住,这是我的第一篇stackoverflow帖子,所以请留下您的反馈。这是有道理的,但是如果我做了
$comment->page()->associate($page)
那么它会正确地附加它,尽管页面没有ID,但是它不会抛出任何错误,但是它也不会正确地关联它。事实上,它将page\u id
设置为null
,因为正如您所说,$page
对象上没有id。不,它正确关联。page\u id
确实是空的,但是关系数组被填充了-dd($comment)
打印了这样的内容:如果失败,我不会称之为正确。事实上,应该存在某种错误,但在这种情况下,Eloquent没有提供任何错误。它不会失败:)页面的ID为null
,因此它将$background->page\u ID
设置为null。然后将页面
添加到关系中。这一切都是有意义的,而且都是正确的,而不是完美的,这正是我所需要的:)ThanksHow你以后会保存评论吗?@Boedy这是一个单独的问题-这只是谈论未链接到数据库的对象。如果要保存注释,需要先保存页面,然后使用>save()方法链接它们。我所做的不会在数据库中连接它们,因为它们没有ID;它只是将注释对象添加到集合中。在此处说明显而易见的内容。。。您应该记住,在$page
中调用comments
属性将触发数据库中的查询,因此它可能比您预期的要慢。您还应该能够使用$page->push()保存页面和所有相关注释,而不是单独保存每个注释。