update 不能触发触发观察器?

1.老项目维护需要对数据表中字段A进行操作,每次这张表发生了更新操作,就要对A进行重新计算,但是项目比较大,多数更新都是用model::where()->update([]);来进行更新。想使用观察者public function updated来进行监听,但是发现不触发。想问问有什么其他方法来达到想要这种效果?

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

$list = Model::where()->get(); foreach($list as $m){ $m->fill($data)->save(); } 试试这样子的写法,你可以试试

4年前 评论

@arukas 换成save确实会触发,但是项目涉及到的地方太多了几乎全部都是用的update来进行修改

4年前 评论
// Model::where ()->update (['a' => 123]) 换成 $model->save()
$model->a = 123;
$model->save()
4年前 评论
//或者每次update之后触发一个事件
//然后监听这个事件,去干你想做的事情
Model::where ()->update (['a' => 123]);
event('SomeEvent');
4年前 评论

file

解决办法就是楼上的

4年前 评论

@di-gua 应该也只有这种方法了,只能在每个update后面去添加。

4年前 评论
lyxxxh 4年前

如果是更新一条可以User::where($where)->first()->update($fill),多条只能$users = User::get()

foreach($users as $user){
    $user->update($fill)
}

可以少写一个save() :joy:

4年前 评论
幽弥狂

直接用异步事件来实现吧,效果一样的。

4年前 评论

有包来完善监控这个的,我之前也遇到过这个问题

4年前 评论

@609468798 能否说一下是哪个包呢?

4年前 评论

@xiangyang composer require shineyork/laravel-extend-database 可能有bug 自己测试下

4年前 评论

下面这样的不会触发模型事件,比如:

xxx::where()->update()
4年前 评论

会不能触发 updated 是因为

model::where ()->update ([]) 等同 DB::where()->update([])

where 返回的是 Illuminate\Database\Eloquent\Builder

所以 update() 是 Builder 的 update(), 而不是 model 里的 update()

自然就不会触发到 updated 事件

个人作法也是跟几位楼上的相似

User::where()->all()->each(function ($model) {
    $model->update([]);
}); 
3年前 评论

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