【问题标题】:Laravel mutator do not set model attribute automaticallyLaravel mutator 不会自动设置模型属性
【发布时间】:2020-04-20 07:21:18
【问题描述】:

在我的项目中有一个PackageRequest 模型,而这个模型有一个tracking_code。 我想用一个 mutator 自动设置这个属性。 这是我的突变体:

 public function setTrackingCodeAttribute()
    {

        $code = mt_rand(1000000, 9999999);
        $this->attributes['tracking_code'] = "$code";
    }

但是当我将新请求保存到数据库时,没有tracking_code

这是我创建新 PackageRequest 的部分代码:

 public function store(Request $request)
    {
        $input = $request->only(['requested_time', 'address_id']);
        $valid = validator($input, [
            'requested_time' => 'required|date',
            'address_id' => 'required|numeric|exists:addresses,id'
        ]);

        if ($valid->fails())
            return Response::fail($valid->errors());
        $package_request = new PackageRequest($input);
        $package_request->user_id = \Auth::id();
        $package_request->status = 'waiting';

        if(!$package_request->save())
            return Response::error(__('errors.save_data', ['attr' => __('errors.attribures.package_request')]));

        return Response::success(PackageRequest::find($package_request->id), 201);
    }

【问题讨论】:

    标签: laravel eloquent laravel-6


    【解决方案1】:

    mutator 将接收在属性上设置的值,允许您操纵该值并在 Eloquent 模型的内部 $attributes 属性上设置操纵值。

    当您尝试将值设置为属性tracking_code 时,将自动调用mutator,并且您没有对其进行任何设置。您需要在creating 之前将默认值设置为tracking_code,因此您可以在模型PackageRequest 中添加这些代码:

    protected static function boot()
    {
        parent::boot();
        static::creating(function($package_request)
        {
            $package_request->tracking_code = mt_rand(1000000, 9999999);
        });
    }
    

    【讨论】: