Slug name和id Laravel 5.4

时间:2017-03-26 00:00:52

标签: laravel laravel-5 laravel-5.4

我尝试在同一时间用他的名字和id为我的User模型制作一个slug属性,并且这样做我尝试在EventServiceProvider中创建一个保存的函数,这个函数将在保存用户后执行,代码:

User::saved(function($user){
             $user->slug = str_slug($user->name.' '.$user->id);
             $user->save();
         });

但是我得到一个问题,函数内部的保存会对父保存函数进行递归调用,这会使结果像这样

  

SQLSTATE [22001]:字符串数据,右截断:1406数据太长了   第1行的列'slug'(SQL:更新candidats设置f_name = malek,   l_name = aa,email = a@ra.com,password =   $ 2y $ 10 $ LD2vRISLv8Bo9va / RarOGOF / 7xlg4BjRirOglFw0LB2AEgZiN.B9O,slug =   马利克-AA-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10- 10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10-10- 10-10-10-10-10-10-10-10-10-10-10-10-10-10,updated_at = 2017-03-25 23:52:32,created_at = 2017-03-25   23:52:32,id = 10其中id = 10)

我如何忽略里面保存的函数调用?我需要同样的帮助来解决这个问题,谢谢。

2 个答案:

答案 0 :(得分:5)

您无法在save()内调用saved,因为后者是由前者生成的。

您应该使用created saving的组合来正确设置slug值。在初始保存后调用createdid将可用。如果saving字段被更新,name内的一些基本逻辑将捕获未来的更新。

User::created(function($user) {
  $user->slug = str_slug($user->name . ' ' . $user->id);
  $user->save();
});

User::saving(function($user) {
  if ($user->exists && $user->isDirty('name')) {
    $user->slug = str_slug($user->name . ' ' . $user->id);
  }
});

可用事件列表为outlined in the docs

答案 1 :(得分:0)

你可以尝试一下(未经测试):

<击>     用户::保存(函数($用户){         $ dispatcher = $ user-&gt; getEventDispatcher();         $用户&GT; unsetEventDispatcher();         $ user-&gt; slug = str_slug($ user-&gt; name。&#39;&#39;。$ user-&gt; id);         $用户&GT;保存();         $用户&GT; setEventDispatcher($调度);     });

有一个更好的解决方案,只需调用更新方法而不是保存,例如:

User::saved(function($user){
    // You may check if the name has been changed
    // Ex: if($user->isDirty('name')) { Update... }
    $user
    ->where('id', $user->id)
    ->update([
        'slug' => str_slug($user->name.' '.$user->id)
    ]);
});

在这种情况下,您不需要为任务使用两个事件处理程序,而update方法(来自QueryBuilder)不会触发任何事件。