基于另一个刚刚创建的模型的某些字段创建一个新模型(多态) - Laravel 8
Create a New Model (Polimorphic) based on some of the fields of another just created Model - Laravel 8
我想对代码进行增强,实际上感觉很乱。
当我创建一个具有 'email' 字段的用户时。我还需要基于相同的数据创建电子邮件模型(多态)。
其实UserController的“store”方法看起来有点大。那么,有没有另一种方法来挂钩创建事件,然后创建电子邮件。以下是我现在的做法:
$user = User::make($request->safe()->except('active', 'is_contact', 'groups', 'password'));
$user->password = Hash::make($request->password);
$user->active = (!empty($request->active)) ? 1 : 0;
$user->is_contact = (!empty($request->is_contact)) ? 1 : 0;
$user->save();
$this->saveEmail($user);
和保存电子邮件:
private function saveEmail($user)
{
$email = new Email;
$email->fill([
'email' => $user->email,
'email_type' => 'primary',
'main' => 1,
]);
$user->emails()->save($email);
}
那么,有没有其他方法可以在控制器之外执行此操作?
不管怎么说,还是要谢谢你。埃尔南.
有一种更简洁的方法可以做到这一点,那就是使用 laravel 观察器。
你可以通过两种方式做到这一点:-
第一种方式,在用户模型中添加创建函数,每次创建用户时都会触发
public static function boot() {
parent::boot();
//once created/inserted successfully this method fired, so I tested foo
static::created(function (User $user) {
$email = new Email;
$email->fill([
'email' => $user->email,
'email_type' => 'primary',
'main' => 1,
]);
$user->emails()->save($email);
});
}
第二,你可以在一个单独的观察者中 class 看到 link :-
https://laravel.com/docs/8.x/eloquent#observers
我想对代码进行增强,实际上感觉很乱。
当我创建一个具有 'email' 字段的用户时。我还需要基于相同的数据创建电子邮件模型(多态)。
其实UserController的“store”方法看起来有点大。那么,有没有另一种方法来挂钩创建事件,然后创建电子邮件。以下是我现在的做法:
$user = User::make($request->safe()->except('active', 'is_contact', 'groups', 'password'));
$user->password = Hash::make($request->password);
$user->active = (!empty($request->active)) ? 1 : 0;
$user->is_contact = (!empty($request->is_contact)) ? 1 : 0;
$user->save();
$this->saveEmail($user);
和保存电子邮件:
private function saveEmail($user)
{
$email = new Email;
$email->fill([
'email' => $user->email,
'email_type' => 'primary',
'main' => 1,
]);
$user->emails()->save($email);
}
那么,有没有其他方法可以在控制器之外执行此操作? 不管怎么说,还是要谢谢你。埃尔南.
有一种更简洁的方法可以做到这一点,那就是使用 laravel 观察器。 你可以通过两种方式做到这一点:-
第一种方式,在用户模型中添加创建函数,每次创建用户时都会触发
public static function boot() {
parent::boot();
//once created/inserted successfully this method fired, so I tested foo
static::created(function (User $user) {
$email = new Email;
$email->fill([
'email' => $user->email,
'email_type' => 'primary',
'main' => 1,
]);
$user->emails()->save($email);
});
}
第二,你可以在一个单独的观察者中 class 看到 link :- https://laravel.com/docs/8.x/eloquent#observers