具体哪些操作会触发观察者事件?

此处:
file
$reply->topic->increment('reply_count', 1); 没有触发 TopicObserver 的相关事件,那么哪些操作会触发观察者事件?文档中好像并没有详细说明

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 10

$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(); 这也是一个查询构造器.没有模型实例的参与

总的来说记住上面的几种会触发模型事件的情况就可以了

5年前 评论
Code_Er

file
快速入门《Laravel 5.7 中文文档》 你可以去文档看看的

5年前 评论

@Code_Er 这里没有具体说明哪些操作会触发观察,就像这条语句 $reply->topic->increment('reply_count', 1) 就没有触发 topic 的观察

5年前 评论
Code_Er

file
你可以注意下这些单词 增删改查都会触发 ing就是执行中 结尾是d就是执行完后

5年前 评论

@Code_Er 朋友,你好像没理解我的意思。。。
$user->name = 'my_name'; $user->save(); 会触发观察
DB::table('users')->where('id', 1)->update(['name' => 'my_name']); 不会触发观察
$user->increment('age'); 不会触发观察
...
我是被这搞晕了

5年前 评论
Code_Er

@阿伦
如果我没让你明白 我先说声不好意思
首先你上面说的
$user->name = 'my_name'; $user->save(); 会触发观察 因为在这里你使用了模型来进行更改 他在观察者模型下关联的两个事件就是updating 跟updated
而DB::table('users')->where('id', 1)->update(['name' => 'my_name']); 不会触发观察
这是因为你这个不是使用模型没办法触发里面的观察者事件
$user->increment('age'); 不会触发观察
而这个我需要实验才能给百分百正确答案了
你这种应该在观察者模型下saving 跟saved应该可以触发(初步推想)

file

5年前 评论

@Code_Er 对的,之前我也一直以为用 Eloquent 模型操作数据库就会触发观察,用 \DB 直接操作数据库不会触发观察。
$user->increment('age'); 也属于 Eloquent 模型操作数据库,但确实不会触发观察(包括 saving 和 saved)。

5年前 评论
Code_Er

@阿伦 可能需要懂源码的大佬为你解答才行了 我只知道他的使用而已比较菜

5年前 评论

$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(); 这也是一个查询构造器.没有模型实例的参与

总的来说记住上面的几种会触发模型事件的情况就可以了

5年前 评论

file
建议你看一下这篇文章,是不是因为监听器没有注册。
分享:观察器需注册
我也遇到了同样的问题,注册监听器后解决了了。
不知道为什么教程里面没有注册监听器这一步操作

5年前 评论

@zhaoyang365 总结一下,DB一定不会触发模型观察器。Eloquent模型是必须实例化的时候才会触发模型观察器,举例来说 $reply->topic这种说到底还是在$reply这个实例当中(topic填充到$reply当中),但是直接$topic->id就算实例化额

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!