Laravel мутатор не устанавливает атрибут модели автоматически - PullRequest
0 голосов
/ 20 апреля 2020

В моем проекте есть модель PackageRequest, и эта модель имеет tracking_code. Я хочу установить этот атрибут автоматически с помощью мутатора. это мой мутатор:

 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);
    }

1 Ответ

3 голосов
/ 20 апреля 2020

Мутатор получит значение, которое задается для атрибута, что позволяет вам манипулировать этим значением и задавать значение для манипулирования внутренним свойством $attributes модели Eloquent.

Мутатор будет вызываться автоматически, когда вы попытаетесь установить значение атрибута tracking_code, и вы ничего не устанавливаете для него. Вам нужно установить значение по умолчанию tracking_code перед creating, чтобы вы могли добавить эти коды в модель PackageRequest:

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