Laravel 雄辩地将json数组更新为字符串转换失败,但使用save()可以工作

Laravel 雄辩地将json数组更新为字符串转换失败,但使用save()可以工作,laravel,laravel-5,eloquent,Laravel,Laravel 5,Eloquent,我从不同的模型中保存一个模型时遇到问题。讨论中的模型是我的工作模型,我试图保存的模型是我的SatusBar模型。在statusBar模型中,我有一个名为fields的json数据库字段。在我的状态栏模型中,我有: protected $casts = [ 'fields' => 'array' ]; public function status() { return $this->morphTo(); } 在我的作业控制器中,我尝试更新json字段,我已尝试保存它两次:

我从不同的模型中保存一个模型时遇到问题。讨论中的模型是我的工作模型,我试图保存的模型是我的SatusBar模型。在statusBar模型中,我有一个名为fields的json数据库字段。在我的状态栏模型中,我有:

protected $casts = [
  'fields' => 'array'
];

public function status()
{
  return $this->morphTo();
}
在我的作业控制器中,我尝试更新json字段,我已尝试保存它两次:

public function updateStatus(Request $request, Job $job){

$id = $job->status['id'];
$fields = $job->status['fields'];

$id = $job->status['id'];
$fields = $job->status['fields'];
$save = false;

foreach($fields as &$field){
  if($field['field'] == $changeField){
    foreach($field['options'] as $opt){
      if($opt['slug'] == $status){
        $field['selected'] = $status;
        $save = true;
        break 2;
      }
    }
  }
}


if($save){
  //This way works as expected, but doesn't look pretty
  $s = StatusBar::find($id);
  $s->fields = $fields;
  $s->save();

  //This results in an array to string conversion error
  //$job->status()->update(['fields' => $fields]);
}
为什么save方法的第二部分会导致数组到字符串的转换错误?

后一个调用状态->更新。。。不会起作用,因为在查询生成器实例上未调用属性转换,并且通过使用关系作为方法调用,您正在静默地从模型中获取您的雄辩查询生成器的基础查询生成器对象

查询生成器没有模型的概念,因此它不会查找任何属性转换,因此字段值将像sql查询字符串中那样放置,并且此过程会导致数组到字符串的转换

更新 我认为避免该错误的唯一方法是自己直接编码该值:

$job->status->update['fields'=>json_encode$fields]; 这实际上是laravel在后台所做的,当您在数据库保存之前在字段上设置数组的属性强制转换以对其进行编码时,但是请记住,这种方法很容易出错,因为您可能有一天会更改该字段上的mutator,而忘记这个大值


如果我发现任何可能适合此用例的内容,我将进一步查看源代码并更新此答案。

谢谢您的解释。有没有一种方法可以让这个方法与某种变异体一起工作?这管用!不知道为什么我以前没想到这个。我想我是想更深入地研究其他东西,而不是直接编码的简单方法。谢谢Laravel 6.0将支持使用JSON数组的更新查询: