当数据库被种子化时,是否可以阻止Laravel运行模型事件?

Jac*_*ack 19 php laravel laravel-5 laravel-seeding

Laravel的播种机在我的模型上运行各种模型事件,从Product::saved()模型事件中触发新订单通知电子邮件等.

这显着减慢了数据库播种速度.是否可以检测种子是否正在运行,如果是,请告诉Laravel不要运行模型事件?

use*_*496 28

Model类上有一些函数可以让你忽略事件.

在使用模型种子之前,你需要做这样的事情......

YourModel::flushEventListeners();
Run Code Online (Sandbox Code Playgroud)

  • 这似乎不适用于自定义事件。另一个解决方案: ``` // Remove Dispatcher Model::unsetEventDispatcher() ``` 在这种情况下似乎有效。 (2认同)

小智 21

我建议从Eloquent模型中删除此案例中的Dispatcher.

例如.

// Check Dispatcher
Model::getEventDispatcher()

// Remove Dispatcher
Model::unsetEventDispatcher()

// Add Dispatcher
Model::setEventDispatcher(new \Illuminate\Events\Dispatcher);
Run Code Online (Sandbox Code Playgroud)


med*_*ies 4

将特质添加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 ...
    }
}
Run Code Online (Sandbox Code Playgroud)