Slug 名称和 ID Laravel 5.4

Slug name and id Laravel 5.4

我尝试同时使用他的名称和 ID 为我的用户模型创建一个 slug 属性,为此我尝试在 EventServiceProvider 中创建一个保存的函数,该函数将在保存用户后执行,代码:

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

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

SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'slug' at row 1 (SQL: update candidats set f_name = malek, l_name = aa, email = a@ra.com, password = y$LD2vRISLv8Bo9va/RarOGOF/7xlg4BjRirOglFw0LB2AEgZiN.B9O, slug = malek-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 where id = 10)

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

您不能在 saved 中调用 save(),因为后者是由前者生成的。

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

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

你可以试一试(未测试):

User::saved(函数($用户){ $dispatcher = $user->getEventDispatcher(); $user->unsetEventDispatcher(); $user->slug = str_slug($user->name.' '.$user->id); $用户->保存(); $user->setEventDispatcher($dispatcher); });

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

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)不会触发任何事件。