모델 내부에서 업데이트되면 기능이 트리거되지 않습니다.
P粉752826008
2023-08-08 16:31:55
<p>내가 가지고 있는 이미지는 다음과 같습니다.</p>
<pre class="brush:php;toolbar:false;">class Equipment 확장 모델
{
HasFactory,softDeletes를 사용합니다.
보호된 $table = '장비';
protected $fillable = ['station_id', 'parent_id', 'code', 'name', 'description', 'creator_id','deletor_id','updator_id'];
보호된 $softDelete = true;
보호된 $dates = ['deleted_at'];
공개 정적 함수 boot()
{
부모::부팅();
// 전혀 호출되지 않습니다!
static::updated(함수 (모델 $model) {
Log::error('refreshTree 호출 중');
$model->refreshTree();
});
static::created(함수 (모델 $model) {
$model->refreshTree();
});
static::deleted(함수 (모델 $model) {
$model->refreshTree();
});
}
공개 함수 새로 고침 트리(){
로그::error('refreshTree');
$equipment = DB::table('장비')->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,
'텍스트' => $item->이름,
'editURL'=>route('dashboard.basic-info.equipments.edit',['id'=>$item->id]),
'아이들' => $children
];
if(count($children) <= 0)
unset($node['children']);
array_push($tree, $node);
}
}
$tree를 반환합니다.
}
}</pre>
<p>当我创建模型时,创建函数被触发,但当我更新模型时,更新函数没有被触发</p>
<pre class="brush:php;toolbar:false;">//Equipment::where('id',$id)->update(['parent_id'=>$recordTarget['id'] ]); //它没有生效
//저는 也尝试了这个:
$equipment = 장비::find($id);
$equipment->parent_id = $recordTarget['id'];
$equipment->save();</pre>
<p><br /></p>
쿼리 빌더 인스턴스 또는 일괄 업데이트를 사용할 때 한 행만 작업하더라도 이벤트 리스너가 실행되지 않습니다
으아아아트리거하려면 모델 인스턴스를 사용해야 합니다
으아아아이것은
와도 동일합니다. 으아아아그리고 모델에서 update()를 호출하는 것이 쿼리 빌더에서 update()를 호출하는 것과 다르다는 것을 알 수 있습니다.
이를 고려하면 이러한 이벤트를 트리거하려면 코드에 static::updated(function (Model $model) {와 같이 작업할 모델의 인스턴스가 필요합니다. Equipment::where( 'id','>',$id), 모든 이벤트를 처리하려면 영향을 받는 모든 행을 쿼리하고 이에 대한 모델 인스턴스를 생성한 다음 이러한 모델을 사용하여 이벤트를 호출해야 합니다.
이렇게 하면 성능이 저하됩니다
하지만 다른 방법이 없다면 명시적으로 할 수 있습니다
으아아아