【问题标题】:Create a New Model (Polimorphic) based on some of the fields of another just created Model - Laravel 8基于另一个刚刚创建的模型的一些字段创建一个新模型(多态) - Laravel 8
【发布时间】:2021-11-01 08:59:07
【问题描述】:

我想对代码做一个增强,实际上感觉一团糟。

当我创建一个具有“电子邮件”字段的用户时。我还需要基于相同的数据创建一个电子邮件模型(多态)。

实际上 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 laravel-8 eloquent-relationship


    【解决方案1】:

    有一种更简洁的方法是使用 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);  
        });
    }
    

    您可以在单独的观察者类中创建第二个链接:- https://laravel.com/docs/8.x/eloquent#observers

    【讨论】:

    • 太好了,效果很好。还有一个问题。我使用了您建议的代码。我可以使用相同的方法来监视相同的电子邮件字段更新吗?如果用户更新用户->电子邮件,我需要更新相应的电子邮件模型。不管怎么说,还是要谢谢你。最好的祝福。埃尔南。
    • 是的,您可以将它用于几种方法 [created-updated-deleted]
    猜你喜欢
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多