具体哪些操作会触发观察者事件?
此处:$reply->topic->increment('reply_count', 1);
没有触发 TopicObserver 的相关事件,那么哪些操作会触发观察者事件?文档中好像并没有详细说明
高认可度评论:
$user = new User / find / first / all()->first()
这几种方式都可以得到User模型的一个实例
$user->save() // $user->exist == true 的话 saving -> updating -> updated -> saved 否则 saving -> creating -> created -> saved
$user->update() // $user->fill(); $user->save()
$user->create() // $user->fill(); $user->save();
$user->delete()
触发模型事件有一个很显然的特点就是, 一定会存在模型实例. 其实上面就是所有的观察者事件的触发情况了.
举几个不会触发的例子
User::where('id', 1)->update(['name', 'eienao']); 这一条比较明显不会触发, 其始终没有一个模型实体的参与.
极端一点的例子
$user = User::first();
$user->where('id', 1)->update(['name', 'eienao']); 这样也不会触发模型事件.因为模型实例调用where时 返回的就是一个查询构造器.模型实例此时已经不参与其中了,其只是做一个引导出查询构造器的作用
包括楼主说的
$user->increment(); 其本质上就是 $user->where('id', $user->id)->increment(); 这也是一个查询构造器.没有模型实例的参与
总的来说记住上面的几种会触发模型事件的情况就可以了
快速入门《Laravel 5.7 中文文档》 你可以去文档看看的
@Code_Er 这里没有具体说明哪些操作会触发观察,就像这条语句
$reply->topic->increment('reply_count', 1)
就没有触发 topic 的观察你可以注意下这些单词 增删改查都会触发 ing就是执行中 结尾是d就是执行完后
@Code_Er 朋友,你好像没理解我的意思。。。
$user->name = 'my_name'; $user->save();
会触发观察DB::table('users')->where('id', 1)->update(['name' => 'my_name']);
不会触发观察$user->increment('age');
不会触发观察...
我是被这搞晕了
@阿伦
如果我没让你明白 我先说声不好意思
首先你上面说的
$user->name = 'my_name'; $user->save(); 会触发观察 因为在这里你使用了模型来进行更改 他在观察者模型下关联的两个事件就是updating 跟updated
而DB::table('users')->where('id', 1)->update(['name' => 'my_name']); 不会触发观察
这是因为你这个不是使用模型没办法触发里面的观察者事件
$user->increment('age'); 不会触发观察
而这个我需要实验才能给百分百正确答案了
你这种应该在观察者模型下saving 跟saved应该可以触发(初步推想)
@Code_Er 对的,之前我也一直以为用 Eloquent 模型操作数据库就会触发观察,用 \DB 直接操作数据库不会触发观察。
$user->increment('age');
也属于 Eloquent 模型操作数据库,但确实不会触发观察(包括 saving 和 saved)。@阿伦 可能需要懂源码的大佬为你解答才行了 我只知道他的使用而已比较菜
$user = new User / find / first / all()->first()
这几种方式都可以得到User模型的一个实例
$user->save() // $user->exist == true 的话 saving -> updating -> updated -> saved 否则 saving -> creating -> created -> saved
$user->update() // $user->fill(); $user->save()
$user->create() // $user->fill(); $user->save();
$user->delete()
触发模型事件有一个很显然的特点就是, 一定会存在模型实例. 其实上面就是所有的观察者事件的触发情况了.
举几个不会触发的例子
User::where('id', 1)->update(['name', 'eienao']); 这一条比较明显不会触发, 其始终没有一个模型实体的参与.
极端一点的例子
$user = User::first();
$user->where('id', 1)->update(['name', 'eienao']); 这样也不会触发模型事件.因为模型实例调用where时 返回的就是一个查询构造器.模型实例此时已经不参与其中了,其只是做一个引导出查询构造器的作用
包括楼主说的
$user->increment(); 其本质上就是 $user->where('id', $user->id)->increment(); 这也是一个查询构造器.没有模型实例的参与
总的来说记住上面的几种会触发模型事件的情况就可以了
建议你看一下这篇文章,是不是因为监听器没有注册。
分享:观察器需注册
我也遇到了同样的问题,注册监听器后解决了了。
不知道为什么教程里面没有注册监听器这一步操作
@zhaoyang365 总结一下,DB一定不会触发模型观察器。Eloquent模型是必须实例化的时候才会触发模型观察器,举例来说 $reply->topic这种说到底还是在$reply这个实例当中(topic填充到$reply当中),但是直接$topic->id就算实例化额