【问题标题】:Update multiple rows of database in Laravel在 Laravel 中更新多行数据库
【发布时间】:2015-04-16 20:15:48
【问题描述】:

我想要一个更新多行数据库的代码,如下所示:

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 方法可以做得更好吗?!

【问题讨论】:

    标签: php laravel laravel-4 orm


    【解决方案1】:

    这是一个简单的方法。

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

    我是从this链接找到的

    希望对你有帮助。

    【讨论】:

    • 假设所有记录都应该具有相同的值,这是正确的答案。您可以更改指向手册的链接,而不是其他网站。
    【解决方案2】:
        $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 但有错误:Indirect modification of overloaded property Value::$data has no effect
    • 对不起,错了$this->attributes['dmm_month']。我从我的项目中复制\粘贴:)。我改变了对$this->attributes['data']的回答
    • 我运行这段代码。并改变。请看我的回答和屏幕截图。
    • 但对我来说仍然是同样的错误!有没有办法在foreach之后保存所有更改?当数据库记录很多时,我认为这种方式很慢
    • 好的。我的代码和你的不相等。使用$tmp=$value->data; $tmp->default = $field->default; $value->data = $tmp; $value->save();
    猜你喜欢
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 2020-06-23
    • 2017-08-06
    相关资源
    最近更新 更多