我尝试在同一时间用他的名字和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,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)
我如何忽略里面保存的函数调用?我需要同样的帮助来解决这个问题,谢谢。
答案 0 :(得分:5)
您无法在save()
内调用saved
,因为后者是由前者生成的。
您应该使用created
和 saving
的组合来正确设置slug
值。在初始保存后调用created
,id
将可用。如果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)不会触发任何事件。