功能在模型內部更新時沒有被觸發
P粉752826008
P粉752826008 2023-08-08 16:31:55
0
1
472
<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['孩子']);

                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']]);
}
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!