【问题标题】:laravel update json querylaravel 更新 json 查询
【发布时间】:2020-01-10 12:05:40
【问题描述】:

我有一个名为"info" 的列的mysql db,这是json 列。 我有这个json:

{ 
   "pizza":{ 
      "sugar":"yes",
      "calorie":"100",
      "protein":"no"
   },
   "hamburger":{ 
      "sugar":"no",
      "calorie":"120",
      "protein":"yes"
   }
}

当我想更新例如比萨的卡路里时没有问题:

DB::table('food')->where('id', '=', '1')
    ->update(array('info->pizza->calorie' => '90'));

然后在我的数据库中:

{ 
   "pizza":{ 
      "sugar":"yes",
      "calorie":"90",
      "protein":"no"
   },
   "hamburger":{ 
      "sugar":"no",
      "calorie":"120",
      "protein":"yes"
   }
}

但是当我想添加一些食物时,例如巧克力:

DB::table('food')->where('id', '=', '1')
    ->update(array('info->chocolate->calorie' => '10'));

什么都没发生。

我可以通过什么方式做到这一点?谢谢!

【问题讨论】:

  • 我看到了 pizza 对象,但我在代码中的任何地方都没有看到 chocolate 对象。
  • @UdoE。代码中没有巧克力。我想加比萨饼和汉堡包这样的巧克力……

标签: arrays json laravel laravel-5


【解决方案1】:

我知道这是准确的答案,因为必须在 DB 上执行 2 个查询。但这是一种解决方法。

$food = DB::table('food')->where('id', '=', '1')->first();
$info = json_decode($food->info, true);
$info['chocolate']['calorie] = 10;
$food->info = json_encode(json_encode($info), JSON_FORCE_OBJECT);
$food->save();

【讨论】:

    【解决方案2】:

    您不能为 MySQL 表中的 json 列更新不存在的键。查看this post 以更好地了解原因。

    要解决这个问题,最好的办法是检索列 json 数据,对其进行解码,插入新的对象条目,再次对其进行编码,最后用新的 json 数据更新表。

    $food = DB::table('food')->where('id', '=', '1')->first();
    $info = json_decode($food->info);
    $info->chocolate = (object)["calorie"=>"10"];
    
    DB::table('food')->where('id', '=', '1')
        ->update(['info' => json_encode($info)]);
    
    

    【讨论】:

      【解决方案3】:

      您使用的是哪个版本的 Laravel?我可以使用 5.7 和 5.8 在 JSON 转换列中设置新键:

      用户模型:

      protected $casts = [
         'phone_numbers' => 'json',
      ];
      

      更新:

      User::first()->phone_numbers;
      

      [ '移动' => '0000000000', ]

      User::first()->update(['phone_numbers->office'] => '9999999999']);
      User::first()->phone_numbers;
      

      [ '移动' => '0000000000', '办公室' => '9999999999', ]

      更新嵌套值:

      User::first()->update(['phone_numbers->office->ext'] => '100']);
      User::first()->phone_numbers;
      

      [ '移动' => '0000000000', '办公室' => [ 'ext' => '100', ], ]

      编辑:您没有为info 列设置$fillable,对吗?如果是这样,我相信您必须为批量分配指定每个单独的属性:

      protected $fillable = [
          'info->chocolate',
      ];
      

      您可以通过将其从 $fillable 中删除并将 $guarded 设置为空数组(暂时)来快速测试它:

      protected $guarded = [];
      

      【讨论】:

        猜你喜欢
        • 2019-01-28
        • 1970-01-01
        • 1970-01-01
        • 2019-01-04
        • 1970-01-01
        • 1970-01-01
        • 2016-04-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多