Laravel 拉威尔:在创建模型时,如何修复这个特性(带有属性)以使其也起作用?

Laravel 拉威尔:在创建模型时,如何修复这个特性(带有属性)以使其也起作用?,laravel,dynamic,model,save,Laravel,Dynamic,Model,Save,我正在使用trait动态地将电子邮件属性添加到模型中。它使我能够在许多模型中重用代码。但是,当我尝试创建新模型时,此代码失败(但当我更新现有模型时,成功) 问题在于假设Traits/Contact/HasEmails>setEmailTypeAttribute中有$this->id。Id尚不可用,因为保存尚未完成 我的问题是:在创建模型时,如何修复此特性以使其也起作用 谷歌,没有结果 考虑一些模型事件(静态::创建($model)) \app\Traits\Contact\HasEmails.p

我正在使用trait动态地将电子邮件属性添加到模型中。它使我能够在许多模型中重用代码。但是,当我尝试创建新模型时,此代码失败(但当我更新现有模型时,成功)

问题在于假设Traits/Contact/HasEmails>setEmailTypeAttribute中有$this->id。Id尚不可用,因为保存尚未完成

我的问题是:在创建模型时,如何修复此特性以使其也起作用

谷歌,没有结果 考虑一些模型事件(静态::创建($model))

\app\Traits\Contact\HasEmails.php


/*
*电子邮件通用getter。请求$model->EmailGeneric时调用。
*/
公共函数getEmailGenericAttribute():?字符串
{
返回$this->getEmailTypeAttribute(EmailType::GENERIC);
}
/*
*电子邮件通用设置器。设置$model->EmailGeneric时调用。
*/
公共函数setEmailGenericAttribute($email)
{
返回$this->setEmailTypeAttribute(EmailType::GENERIC,$email);
}
/*
*为模型所有者获取单个电子邮件模型
*/
私有函数getEmailTypeAttribute($emailType):?字符串
{
$emailModel=$this->emailModelForType($emailType);
返回$emailModel?$emailModel->email:null;
}
/*
*为模型所有者更新或创建单个电子邮件模型
*
*@返回无效
*/
私有函数setEmailTypeAttribute($emailType,$email):无效
{
$this->emails()->updateOrCreate([
'owned_by_type'=>static::class,
'owned_by_id'=>$this->id,
'type'=>$emailType
],['email'=>$email]);
}
\app\Models\Email.php


名称空间应用程序\模型;
类电子邮件扩展模型
{
public$timestamps=false;
/**
*质量可分配的属性。
*
*@var数组
*/
受保护的$fillable=[
“电子邮件”
];
/*
*获取多态所有者
*/
公共函数ownedBy():\illumb\Database\elount\Relations\morpto
{
返回$this->morphTo();
}
/*
*默认属性是预先填充的
*/
受保护的函数addDefaultAttributes():void
{
$attributes=[];
$attributes['type']=\App\Enums\EmailType::GENERIC;
$this->attributes=array\u merge($this->attributes,$attributes);
}
}
\迁移\2019\u 10\u 16\u 101845\u创建\u电子邮件\u table.php

Schema::create('emails',函数(Blueprint$表){
$table->bigIncrements('id');
$table->unsignedbiginger('owned_by_id');
$table->string('owned_by_type');
$table->string('type');//f.e.采用EmailType
$table->string('email');
$table->unique(['owned_by_id'、'owned_by_type'、'type']、'owner_type_unique');
});

我希望创建/更新相关模型,但创建时失败。

技巧是使用已保存的模型事件,并且不要忘记在电子邮件模型上设置可填充属性:

/*
*为模型所有者更新或创建单个电子邮件模型
*
*@返回无效
*/
私有函数setEmailTypeAttribute($emailType,$email):无效
{
静态::已保存(静态函数($model)使用($emailType,$email){
$model->email()
->更新或创建(
[
'owned_by_type'=>get_class($model),
'owned_by_id'=>$model->id,
'type'=>$emailType
],
[
'email'=>$email
]);
});
}