是否有可能防止Laravel运行模型事件时,数据库正在被播种


Is it possible to prevent Laravel running Model Events when the database is being Seeded?

Laravel的播种机在我的模型上运行各种模型事件,这些事件触发来自Product::saved()模型事件的新订单通知电子邮件。

这会显著降低数据库播种速度。是否有可能检测种子是否正在运行,如果是这样,告诉Laravel不运行模型事件?

Model类中有一些函数允许您忽略事件。

在使用模型播种之前,您需要做这样的事情…

YourModel::flushEventListeners();

我建议将本例中的Dispatcher从Eloquent Model中移除。

例如

// Check Dispatcher
Model::getEventDispatcher()
// Remove Dispatcher
Model::unsetEventDispatcher()
// Add Dispatcher
Model::setEventDispatcher(new 'Illuminate'Events'Dispatcher);

为播种机添加WithoutModelEvents性状

namespace Database'Seeders;
use Illuminate'Database'Console'Seeds'WithoutModelEvents;
use Illuminate'Database'Seeder;
class DatabaseSeeder extends Seeder
{
    use WithoutModelEvents;
    public function run(): void
    {
        // Silent eloquent queries ...
    }
}