【问题标题】:Eloquent update in laravel without deleting the old content在 laravel 中进行 Eloquent 更新而不删除旧内容
【发布时间】:2023-03-10 19:31:01
【问题描述】:

我的班级中有 status 属性。创建新实例时,使用“create”,我将数组传递给状态。

class email extends Eloquent{

    protected $table = 'emails';
    protected $fillable = array(
        'status',
    );
}

这就是结果

"status": {
  "sent": false,
  "deleted": false,
  "silent": false
}

我正在尝试这样做以仅更新其中一种状态。

$dest= email::where('uid', "5040")->update(['status.sent'=>true]);

但这会产生我不喜欢的结果。

"status": {
  "sent": true
}

之前写的所有内容都被删除了,怎么得到这个结果。

"status": {
  "sent": true,
  "deleted": false,
  "silent": false
}

我有一个查询银行并获取状态数组、存储、更改和更新它的想法,但这会使我查询银行两次。一个获取数组,另一个更新。有一种方法,例如“传播”(...)。或者更正确、更简单的方法。

【问题讨论】:

  • 状态列的数据类型是什么?
  • $mensage['status'] = ['sent'=>false,'deleted'=>false,'silent'=>false];
  • 不,数据库中的数据类型是什么?
  • @Aynber 数组,我认为
  • @Aynber 它实际上是一个 json

标签: php laravel laravel-5


【解决方案1】:

在模型中添加$casts

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

然后

$dest = email::where('uid', "5040")->update(['status->sent' => true]);

参考:https://laravel.com/docs/6.x/queries#updating-json-columns

【讨论】:

  • 我进行了更改,更新时,$dest 返回 1 且没有错误,但状态仍然为 false,没有更新。
  • @RicardoSpinola 您使用的是哪个 laravel 版本?
  • @RicardoSpinola 你在电子邮件模型中添加了演员表吗?
  • 是的,在创建类的实例时,我正在处理状态并以这种方式接收它的数组。 $mensage['status'] = ['sent'=>false,'deleted'=>false,'silent'=>false];
  • @RicardoSpinola 我已经添加了文档的引用。它应该可以工作。并且在 laravel 8 中我测试了它,它可以工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
相关资源
最近更新 更多