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()保存页面和所有相关注释,而不是单独保存每个注释。