मैं बनाने की विधि को ओवरराइड करना चाहता हूं, लेकिन संबंध के साथ, यह निर्माण विधि को स्पर्श नहीं करता है।

दो मॉडल हैं:

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 में कोई लॉग नहीं है, जिसका अर्थ है कि लार्वा ने निर्माण विधि को नहीं छुआ है, तो मुझे इस परिस्थिति में बनाने की विधि को ओवरराइड करने के लिए कैसे करना चाहिए? (मैं लार्वा 5.7 का उपयोग कर रहा हूं)

0
Autodesk 5 जिंदा 2019, 18:05

1 उत्तर

सबसे बढ़िया उत्तर

धन्यवाद @ जोनास स्टॉडेनमेयर, जब मैंने दस्तावेज़ीकरण पढ़ा, तो मेरा समाधान यहां है।

यदि $विशेषताएं सुरक्षित $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);
    }
}

अन्यथा, मैं इसे ऑब्जर्वर में करता हूं।

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

मैं आसान रखरखाव के लिए ईवेंट और श्रोता के बजाय ऑब्जर्वर चुनता हूं।

1
Autodesk 6 जिंदा 2019, 13:09