功能在模型内部更新时没有被触发
P粉752826008
P粉752826008 2023-08-08 16:31:55
0
1
482
<p>我有一个像这样的模型:</p>
class Equipment 扩展 Model
{
    使用 HasFactory、softDeletes;
    protected $table = '设备';
    protected $fillable = ['station_id', 'parent_id', '代码', '名称', '描述', 'creator_id', 'deletor_id', 'updator_id'];
    受保护的$softDelete = true;

    受保护的$dates = ['deleted_at'];

    公共静态函数 boot()
    {
        父::启动();

 //它根本没有调用!
        静态::更新(函数(模型$模型){
            Log::error('调用刷新树');
            $model->refreshTree();
        });


        静态::创建(函数(模型$模型){
            $model->refreshTree();
        });



        静态::删除(函数(模型$模型){
            $model->refreshTree();
        });

    }


    公共函数刷新树(){
        Log::error('refreshTree');
        $equipment = DB::table('equipments')->get();
        $treeData = $this->generateTree($equipment);

        $jsonData = json_encode($treeData);
        Redis::set(config('redis.EquipmentTree'),$jsonData);
    }

    私有函数generateTree($data, $parentId = 0) {
        $树= [];

        foreach($data 作为$item){
            if ($item->parent_id == $parentId) {
                $children = $this->generateTree($data, $item->id);


                $节点= [
                    'id'=> $item->id,
                    '文本' => $项目->名称,
                    'editURL'=>route('dashboard.basic-info.equipments.edit',['id'=>$item->id]),
                    '孩子们' => $儿童
                ];
                if(计数($children) <= 0)
                    取消设置($node['children']);

                array_push($tree, $node);
            }
        }

        返回$树;
    }

}</pre>
<p>当我创建模型时,创建函数被触发,但当我更新模型时,更新函数没有被触发

//设备::where('id',$id)->update(['parent_id'=>$recordTarget['id'] ]); // 没有生效
//我也尝试过这个:
            $设备=设备::find($id);
            $equipment->parent_id = $recordTarget['id'];
            $equipment->save();
; <p><br />></p>
P粉752826008
P粉752826008

全部回复(1)
P粉165522886

当使用查询构建器实例或批量更新时,即使你只针对一行进行操作,事件监听器也不会触发

Equipment::where('id',$id) //right here you get a Builder instance
    ->update([]); //will not trigger the event listener as it is a mass update

要触发它,你需要使用模型实例

Equipment::where('id',$id)->first() //This returns a model instance
    ->update([]); //will trigger the event listener as it is a single instance update

这也等同于

$equipment = Equipment::find($id);
$equipment->parent_id = ..;
$equipment->save();

并且你可以看到,在模型上调用update()与在查询构建器上调用update()是不同的。

当你考虑到,要触发这些事件,代码需要一个模型的实例来与之一起工作,就像static::updated(function (Model $model) {那样。如果你的查询不同,例如Equipment::where('id','>',$id),为了处理所有事件,它需要查询所有受影响的行,为它们生成模型实例,然后使用这些模型调用事件。

这会降低性能

但是如果没有其他办法,你可以明确地这样做

$equipments = Equipment::where('id','>',$id)->get();
foreach ($equipments as $equipment) {
    $equipment->update(['parent_id'=>$recordTarget['id']]);
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板