在Laravel中更新多行数据库

14
我需要一段更新数据库多行数据的代码,类似于这样:
UPDATE values SET data='{"options":["male","female"],"default":"male"}' where project_id=1 and id=1;
UPDATE values SET data='{"options":["male","female"],"default":"male"}' where project_id=1 and id=2;
UPDATE values SET data='{"options":["male","female"],"default":"male"}' where project_id=1 and id=3;

经过几个小时的努力,我在Laravel框架中得到了以下类似的结果:

$values = Value::where('project_id', $id)->get();
$sql = "";
foreach($request->fields as $field) {
  if(!empty($field->default)) { //New default value is set
    foreach($values as $value) {
      $data = json_decode($value->data, true); /**data column as json object in mysql database **/
      $data["default"] = $field->default;
      $data = json_encode($data);
      $sql .= "update ".DB::connection()->getDatabaseName().".values set data='".$data."' where id="."$value->id;";
    }
  }
}
DB::unprepared($sql);

但这段代码并不是一个好的实践!所以我的问题是

有没有ORM的方式可以做得更好?!

2个回答

22

这是一个简单的方法来完成它。

$values = Value::where('project_id', $id)->update(['data'=>$data]);

我从这个链接中找到了它。

希望能有所帮助。


假设所有记录应该具有相同的值,这就是正确的答案。您可以将链接更改为手册而不是其他网站。 - Michael

-6
    $values = Value::where('project_id', $id)->get();
    $sql = "";
    foreach($request->fields as $field) {
      if(!empty($field->default)) { //New default value is set
        foreach($values as $value) {      
          $tmp=$value->data;
          $tmp->default = $field->default;
          $value->data = $tmp;
          $value->save();
        }
      }
    }

Value 模型中使用 MutatorAccessor,就像这样。
public function getDataAttribute($value)
{
    return json_decode($value);
}
public function setDataAttribute($value)
{
    $this->attributes['data'] = json_encode($value);
}

请查看文档 http://laravel.com/docs/4.2/eloquent#accessors-and-mutators

工作 - https://yadi.sk/i/BnC3HYozehoy2


非常感谢@vitalik_74,但是出现了一个错误:间接修改重载属性Value::$data没有效果 - Hamid Zamani
抱歉,$this->attributes['dmm_month'] 是错误的。我从我的项目中复制粘贴了代码 :) 。我已经更改为 $this->attributes['data'] - vitalik_74
我运行了这段代码。然后进行了修改。请查看我的回答和截图。 - vitalik_74
但是对我来说仍然是相同的错误!有没有办法在foreach之后保存所有更改?当数据库记录很多时,我认为这种方法会很慢。 - Hamid Zamani
1
好的。我的代码和你的不一样。使用 $tmp=$value->data; $tmp->default = $field->default; $value->data = $tmp; $value->save(); - vitalik_74
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接