Laravel 模型字段序列化无法更新的问题 [已解决]

修改器《Laravel 5.8 中文文档》

在阅读了文档后,发现laravel可以在新建和读取的时候对某一个字段自动进行序列化,正好我的商品表Product拥有多个参数,我又不想弄成HasMany的关联关系,于是尝试一下,我拥有一个模型ProductParam,定义需要序列化的字段param

class ProductParam extends Model
{
    //将param字段序列化
    protected $casts=['param'=>'array'];
}

新建商品

    //新建商品动作
    public function store(ProductPost $request)
    {
            DB::transaction(function () use ($request) {
                //插入数据到商品表
                $product = Product::create($request->all());

                //插入数据到商品描述表
                $product->description()->create([
                    'description' => $request->input('description'),
                    'editor-html-code' => $request->input('editor-html-code')
                ]);

                //插入数据到商品参数表
                $product->param()->create([
                    'param' => $request->input('param')
                ]);

            }, 5);
    }

截止到目前新建一切都是OK的,存到数据库里面字段也是自动转了json的.

编辑商品

//编辑商品动作
    public function update(ProductPost $request, $id)
    {
            DB::transaction(function () use ($request, $id) {

                $product = Product::find($id);
                //更改商品表
                $product->update($request->all());

                //更改商品描述表
                $product->description()->update([
                    'description' => $request->input('description'),
                    'editor-html-code' => $request->input('editor-html-code')
                ]);

                //更新商品参数
                $product->param()->update([
                  //为了方便沟通,定义下面这一行行号为#88
                    'param' => $request->input('param'),
                ]);

            }, 5);

    }

当我照这样来更新的时候,报错如下:

laravel 模型字段序列化的问题
第88行 $request->input('param') 打印出来的值如下:

laravel 模型字段序列化的问题

如果我将第88行的 'param' => $request->input('param'), 修改为 'param' =>99999, 那么此刻是可以更新成功的.

此贴中注释的4行代码是我按文档的示例修改而来,但是发现并没有作用,此问题困扰我多时,希望得到解答.不然我只能手动序列化了...

感谢关注 !

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

$product->param() 改成 $product->param
$casts 是定义在 Model 类中的属性;要 Model 类调用才会触发;
$product->param 返回的是 Model 类;
$product->param() 返回的是一个继承自 Illuminate\Database\Eloquent\Relations\Relation 的 Relation 类;

4年前 评论
讨论数量: 3

$product->param() 改成 $product->param
$casts 是定义在 Model 类中的属性;要 Model 类调用才会触发;
$product->param 返回的是 Model 类;
$product->param() 返回的是一个继承自 Illuminate\Database\Eloquent\Relations\Relation 的 Relation 类;

4年前 评论

@白俊遥 非常感谢回答,学习了.对模型的调用有了新的认识. :heart_eyes:

4年前 评论

楼上说的对,$product->param()返回的是Relation类,导致继续调用update方法其实是在进行批量更新操作,而批量更新操作是不会触发任何模型事件及序列化模型操作的

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!