26

我建立了以下关系:

类页面{公共函数注释(){return$this->hasMany('Comment');}}类注释{公共函数页(){return$this->belongsTo('Page');}}

相当标准的沼泽。一个页面可以有多条评论,一条评论属于一个页面。

我想创建一个新页面:

$page=新页面;

和评论

$comment=新评论;

并将评论附在页面上,没有保存任何内容

$page->comments->associate($comment);

我尝试了以下方法:

//这些是来自many端的一对多(例如$comment->page->associate…)$page->comments->associate($comment);//调用未定义的方法Illuminate\Database\Eloquent\Collection::associate()$page->comments()->关联($comment);//调用未定义的方法Illuminate\Database\Query\Builder::associate()//这两个是多对多的关系,所以不起作用$page->comments->attach($comment);//调用未定义的方法Illuminate\Database\Eloquent\Collection::attach()$page->comments()->附加($comment);//调用未定义的方法Illuminate\Database\Query\Builder::attach()//这2个将(如果成功)保存到数据库,我不想这样$page->comments->save($comment);//调用未定义的方法Illuminate\Database\Eloquent\Collection::save()$page->comments()->保存($comment);//完整性约束冲突:1048列“page_id”不能为空

真正奇怪的是,做相反的事情(将页面附加到评论)效果正确:

$comment->page()->关联($page);

相关文件如下在这里但他们没有提到一对多的一方。这有可能吗?(我觉得应该是这样)

3个答案

重置为默认值
38

听起来您只想将新的注释对象添加到页面的注释集合中-使用基本的colection add方法可以轻松完成此操作:

$page=新页面;$comment=新评论;$page->comments->add($comment);
6
  • 之后你如何保存评论?
    – 博迪
    评论 2014年10月6日21:06
  • 1
    @Boedy这是一个单独的问题-这只是讨论没有链接到数据库的对象。如果您想保存Comment,您需要先保存Page,然后使用>save()方法链接它们。我所做的不会在数据库中实际连接它们,因为它们没有id;它只是将注释对象添加到集合中。 评论 2014年10月7日14:18
  • 在这里说明显而易见的。。。你应该记住评论中的属性$页将触发数据库中的查询,因此可能会比预期的慢。。 评论 2014年11月24日21:12
  • 2
    您还应该能够使用$page->push()保存页面和所有相关注释,而不是分别保存每个注释。
    – 富稀土
    评论 2015年2月25日22:51
  • @rich-remer但当我执行$page->push()时,它返回错误,$comment的外键(即page_id)丢失。对此该怎么办?显然,我无法提供它,因为我没有它。 评论 2016年7月20日15:21
10

由于没有要链接的ID,因此无法执行此操作。

所以首先你需要保存父母($页)然后保存子模型:

//$page是现有模型,$comment不需要$page->comments()->保存($comment);//保存注释

或者反过来,这次没有保存:

//$page仍然存在,$comment不需要$comment->page()->associate($page);//尚未保存评论$comment->save();
10
  • 这很有道理,但如果我这样做$comment->page()->关联($page)然后它正确地连接它,尽管页面也没有ID
    – 
    评论 2014年5月30日10:32
  • 不,它不会抛出任何错误,但也不会正确关联。事实上,它设置了页面id无效的,因为,正如你所说$页对象。 评论 2014年5月30日10:38
  • 1
    不,它关联正确。这个页面id确实为空,但填充了关系数组-dd($comment)打印以下内容:抓取.by/xksA
    – 
    评论 2014年5月30日10:41
  • 如果它失败了,我就不认为它是正确的。事实上应该有一些错误,但Eloquent在这种情况下没有提供任何错误。 评论 2014年5月30日10:52
  • 它不会失败:)页面的ID是无效的所以它设置了$background->page_id设置为null。然后添加第页到关系中。这一切都有道理,都是正确的,没有失败
    – 
    评论 2014年5月30日12:19
6

根据Benubird的说法,我今天无意中发现了以下几点:

您可以对Benubid所述的集合调用add方法。为了考虑edpaaz的担忧(额外激发的查询),我这样做了:

$collection=$page->comments()->getEager();//将返回急切的收藏$collection->添加($comment)//向集合添加注释

据我所知,这将阻止额外的查询,因为我们只使用relation-object。

在我的例子中,其中一个实体是持久的,而第一个实体(在您的案例页面中)没有(并且要创建)。由于我必须处理一些事情,并希望以对象的方式处理,所以我想将持久实体对象添加到非持久实体对象中。不过,这两种方法都应该适用于非持久性。

谢谢贝努比德给我指明了正确的方向。希望我的加入能像帮助我一样帮助别人。

请记住,这是我的第一篇stackoverflow帖子,所以请留下您的反馈。

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.