Переопределить метод создания красноречивых отношений - PullRequest
0 голосов
/ 05 января 2019

Я хочу переопределить метод create, но в отношении он не затрагивал метод create.

Есть две модели:

class User extends Model
{
    public function user_detail()
    {
        return $this->hasOne(UserDetail::class);
    }
}


class UserDetail extends Model
{
    public static function create(array $attributes = [])
    {
        //I was trying to do something like
        /*
        if(isset($attributes['last_name']) && isset($attributes['first_name']))
        {
            $attributes['full_name']=$attributes['first_name'].' '.$attributes['last_name'];
        }
        unset($attributes['first_name'],$attributes['last_name']);
        */

        Log::debug('create:',$attributes);
        $model = static::query()->create($attributes);
        return $model;
    }
}

Когда я использую UserDetail::create($validated), и в laravel.log есть журнал, я знаю, что код коснулся моего пользовательского метода создания.

Но если я использую

$user = User::create($validated);
$user->user_detail()->create($validated);

В laravel.log нет журнала, что означает, что laravel не касался метода create, тогда как я должен был сделать, чтобы переопределить метод create в этих условиях? (Я использую laravel 5.7)

1 Ответ

0 голосов
/ 06 января 2019

Спасибо @Jonas Staudenmeir, после того, как я прочел документацию, вот мое решение.

Если атрибуты $ не находятся в защищенном массиве $ fillable , то я делаю это в методе __construct.

class UserDetail extends Model
{
    protected $fillable=['full_name','updated_ip','created_ip'];

    public function __construct(array $attributes = [])
    {
        if (isset($attributes['first_name']) && isset($attributes['last_name'])) {
            $attributes['full_name'] = $attributes['first_name'].' '.$attributes['last_name'];
        }

        parent::__construct($attributes);
    }
}

В противном случае, я делаю это в Observer.

namespace App\Observers;

use App\Models\UserDetail;

class UserDetailObserver
{
    public function creating(UserDetail $userDetail)
    {
        $userDetail->created_ip = request()->ip();
    }

    public function updating(UserDetail $userDetail)
    {
        $userDetail->updated_ip = request()->ip();
    }

}

Зарегистрируйте Обозреватель в AppServiceProvider.

namespace App\Providers;

use App\Models\UserDetail;

use App\Observers\UserDetailObserver;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        UserDetail::observe(UserDetailObserver::class);
    }
}

Я выбираю Observer вместо Event & Listener для простоты обслуживания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...