我不確定我是否只是誤解了觀察者在 Laravel 中的作業方式,或者我做錯了什么。我目前在 Laravel 6 上運行,雖然這個應用程式目前正在被另一個團隊升級。
我擁有的:
- 父模型,稱為 Parent
- 父觀察者,稱為ParentObserver
- 子模型,稱為 Child
- 子觀察者,稱為 ChildObserver
- 孫子模型,稱為孫子
class Parent extends Model
{
public function children()
{
return $this->hasMany( Child::class );
}
}
class Child extends Model
{
public function grandchild()
{
return $this->hasOne( Grandchild::class );
}
}
我的兩個觀察者都在服務提供者中宣告,并且都被成功呼叫。我的問題,或者可能是誤解,是關于觀察者如何互動的。
我的兩個觀察者都具有在收到洗掉命令時運行的功能。
class ParentObserver
{
public function delete( Parent $parent )
{
$parent->children()->delete();
}
}
class ChildObserver
{
public function delete( Child $child )
{
$child->grandchild()->delete();
}
}
ChildObserver 洗掉功能按預期作業 100%。當我洗掉一個孩子時,孫子也會被洗掉。我感到困惑的是當我洗掉父級時。洗掉了父級,洗掉了子級,但沒有洗掉孫子級。我不是直接呼叫洗掉 ParentObserver 中的孫子,我期望 ChildObserver 功能會被 ParentObserver 中的操作觸發。
設定觀察者時我錯過了什么嗎?或者在觀察者中采取的行動不會觸發其他觀察者,如果它們在代碼的另一部分中,這些觀察者通常會參與這些行動?
uj5u.com熱心網友回復:
這是在執行批量洗掉查詢。它不會deleted為 的每個Parent孩子發出事件。
class ParentObserver
{
public function deleted( Parent $parent )
{
$parent->children()->delete();
}
}
如果您更改為以下內容,它應該可以作業:
class ParentObserver
{
public function deleted( Parent $parent )
{
$parent->children()->get()->each(function (Child $child) {
$child->delete();
});
}
}
可能的改進:
- 該
cursor方法是在 laravel 6 中實作的,因此您可以使用它來代替get減少記憶體使用量 - 您可以將高階訊息與該
each方法一起使用以使代碼更簡單。
class ParentObserver
{
public function deleted( Parent $parent )
{
$parent->children()->cursor()->each->delete();
}
}
uj5u.com熱心網友回復:
來自 Laravel 的檔案:
通過 Eloquent 發出批量更新或洗掉查詢時,將不會為受影響的模型調度保存、更新、洗掉和洗掉的模型事件。這是因為在執行批量更新或洗掉時,模型從未真正被檢索到。
因此,如果您正在進行批量洗掉或批量更新,它不會觸發。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/437557.html
