【问题标题】:Replicate and save on a model recieved by hasManyThrough relation does not work复制并保存 hasManyThrough 关系收到的模型不起作用
【发布时间】: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


【解决方案1】:

试试这个,它会解决你的问题 -

$comments = $project->comments()->get();
foreach($comments as $comment) {
  $replicatedComment = $comment->replicate();
  $replicatedComment->project_id = $project->id;
  $replicatedComment->save();
}

【讨论】:

    猜你喜欢
    • 2014-05-12
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 2016-01-23
    • 2015-02-14
    • 2019-03-25
    • 2016-05-01
    • 1970-01-01
    相关资源
    最近更新 更多