php - Laravel 观察者不处理批量插入

标签 php laravel observable

我必须批量保存数据。数据正在保存,但观察者不工作。我尝试了观察者的所有方法(创建、创建、保存、保存)但没有任何反应。

foreach( $departments as $department) {
         $data[] = [
             'department_id' => $department,
             'name'          => $name,
             'description'   => $description,
         ];
}

if(count($data) > 0) {
   JobDescription::insert($data);
}

namespace App\Observers;
use Auth;

class JobDescriptionObserver
{
    public function created($model)
    {
        echo 'created';
        die;
     }
}

最佳答案

这种行为是预期的,并记录在一个鲜红色的警告中:

When issuing a mass update via Eloquent, the saved and updated model events will not be fired for the updated models. This is because the models are never actually retrieved when issuing a mass update.

https://laravel.com/docs/5.7/eloquent#events

如果您需要在创建模型时分派(dispatch)事件,那么您必须将它们一一保存:

foreach($departments as $department) {
        Jobdescription::create([
             'department_id' => $department,
             'name'          => $name,
             'description'   => $description,
         ]);
}

批量插入和更新行为不同的原因是因为批量插入/更新的底层 SQL 查询不同于更新单行的查询。批量更新不允许 Eloquent 从查询结果中检索 ID 列表,这意味着它不知道更新了哪些模型,因此无法为每个模型发送一个事件。另一方面,单行更新允许 Eloquent 从查询结果中获取 lastInsertId

关于php - Laravel 观察者不处理批量插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54879160/

相关文章:

angular - 我可以将 setTimeout 方法转换为 observable.timer 吗?

php 销毁一个不是当前 session 的 session

php - 保护 MySQL 密码和管理多个帐户的最佳做法是什么?

php - Laravel - 如何每分钟运行一个函数/ Controller ? (任务调度)

javascript - Angular/ typescript : How to resolve this compilation issue?

angular - 组合多个可观察量并在 Angular 中至少返回一个值时采取行动

PhpStorm 在 Windows 上使用 PHP 5.6 表示 "PHP version Not installed"

java - 在android中使用volley发送json数组将mysql中的多条记录添加到php脚本

php - Laravel Eloquent 查找日期早于 2 天的行

laravel - 如何在使用 OR 运算符时使用高级 where 子句