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)不会触发任何事件。
我尝试同时使用他的名称和 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
setf_name
= malek,l_name
= aa,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 whereid
= 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)不会触发任何事件。