【发布时间】:2018-06-26 03:44:57
【问题描述】:
我正在就 Laravel 中一个奇怪的问题征求你的意见。我有一个如下所示的数据库架构:
- 项目
- 身份证
- 任务
- 身份证
- project_id
- cmets
- 身份证
- task_id
我正在通过项目上的 hasManyThrough 关系从数据库中获取一组 cmets。关系如下所示:
public function comments()
{
return $this->hasManyThrough('App\Models\Comment', 'App\Models\Task');
}
这很好用。但是如果我复制一条评论并像这样保存它,它会失败:
// fetch comments on project through a hasManyThrough relation
$comments = $project->comments()->get();
foreach($comments as $comment) {
// this works:
$comment->save();
// this does not work:
$replicatedComment = $comment->replicate();
$replicatedComment->save();
}
保存复制的评论失败并出现以下错误:
找不到列:1054“字段列表”中的未知列“project_id”
不知何故 eloquent 神奇地为所有模型添加了一个额外的属性 project_id,它在调用 replicate() 时没有正确处理。
我可以通过在保存复制的评论之前取消设置 project_id 来轻松解决这个问题,但这不应该是正确的方法。任何人都可以重现这种行为吗?这是一种通缉行为还是我做错了什么?
感谢您的建议 克莱门斯
【问题讨论】:
-
评估以下两种情况 - 1. 将 dd($comment) 放入 foreach 并将结果复制到文本编辑器 2. 将 dd($replicatedComment) 放在 save() 之前并将结果复制到文本编辑器.现在比较数据,检查它们是否相同。
-
您检查过
$replicatedComment的值吗?它正在复制整个关系。 -
@KeshariNandan 我检查了你的建议。对象大多相同。但重要的一点不同:受保护的
original属性中的值不存在于复制模型中。我的假设是,在原始模型上调用 save() 是有效的,因为它没有需要保存到数据库的更改,因此 sql 更新查询只是空的,没有什么会失败。在复制模型上,在 save() 上执行的 sql insert 语句不为空,因此如果有像 project_id 这样没有对应列的属性,它将失败。 -
@Demonowh 是的,但复制 hasManyThrough 在我看来没有任何意义。是吗?
标签: php sql laravel relationship