往数据库填充假数据时,不会触发模型观察器吗?

在填充时用的是 Eloquentinsert(),这样为什么不会触发观察器 TopicObserver

Topic::insert($topics->toArray());

按照文档的说法,当模型第一次被保存时, creating 和 created 事件会被触发,saving / saved 事件也会被触发。

why?是因为触发器会忽略 seeder 文件吗?还是其他原因?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5
DianWang

批量填充不触发观察器,文档上有写的

6年前 评论

@DianWang

文档内容:通过 Eloquent 进行批量更新时,不会为更新的模型触发 saved 和 updated 模型事件。这是因为在进行批量更新时,并未检索该模型。

文档里写的很模糊,这里的更新是指数据变动(增删改),还是单纯的 update 操作?

tinker 里,

// 用 create 创建,不管是一条还是多条,都会触发观察器
factory(Topic::class, 1)->create();
factory(Topic::class, 10)->create();
//而用 insert 创建,不管单条还是多条数据都不会触发
$data = factory(Topic::class, 1)->make();
Topic::insert($data->toArray()[0]);

而在 TopicsTableSeeder 里,与上面的情况相同,->create() 都可以触发, ->insert() 都不能触发
还是一脸懵逼。。
@Summer

6年前 评论
DianWang

@hehorange saved和updated事件,单个的时候会触发,批量的时候不触发

6年前 评论

@DianWang 我这里不对啊,用 insert 单个也不会触发,用 create 多个也能触发。
我猜,应该是这两个方法的问题,去看源码了。。

6年前 评论

@hehorange 一个是db的操作,一个是Eloquent的东西。Eloquent方法有事件监听,db的操作没有相关的方法。这个看源码就知道了

6年前 评论

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