[英]Laravel Eloquent Cascading Deletes
我正在使用 Laravel 4.1 並嘗試級聯刪除。 我這樣做是因為某些刪除方法會刪除存儲在 S3 上的關聯資產,因此不適合依賴 DB 級聯刪除。
假設我有一個 Entry 模型,它本身有一個圖像和許多相關的 Option,它們也有如下所示的圖像(為簡潔起見)。
class Entry extends Eloquent {
public function image()
{
return $this->morphOne('Image', 'imageable');
}
public function options()
{
return $this->hasMany('Option');
}
protected static function boot() {
parent::boot();
static::deleting(function($entry) {
$image = $entry->image;
if($image !== null) {
$image->delete();
}
$entry->options()->delete()
//Option::where('entry_id', $entry->id)->delete(); This also doesn't work
});
}
}
class Option extends Eloquent {
public function entry()
{
return $this->belongsTo('Entry');
}
public function image()
{
return $this->morphOne('Image', 'imageable');
}
protected static function boot() {
parent::boot();
static::deleting(function($option) {
Log::info('Trying to delete an option object');
$image = $option->image;
if($image !== null) {
$image->delete();
}
});
}
}
注意:我正在按照此答案中的建議進行刪除。
當我調用 $entry->delete() 時,它將刪除圖像和條目本身,但是刪除處理程序永遠不會在選項上調用(我沒有看到它輸出到日志)。 但是,如果我在條目刪除功能中使用以下內容,則一切正常。
foreach($entry->options as $option) {
$option->delete();
}
為什么 $entry->options()->delete() 不起作用? 這是 Laravel 中的錯誤還是我犯了錯誤。
class Entry extends Eloquent {
public function image()
{
return $this->morphOne('Image', 'imageable');
}
public function options()
{
return $this->hasMany('Option');
}
protected static function boot() {
parent::boot();
static::deleting(function($entry) {
$image = $entry->image;
if($image !== null) {
$image->delete();
}
$entry->options->each(function($option) {
$option->delete();
});
//Option::where('entry_id', $entry->id)->delete(); This also doesn't work
});
}
}
有一個很好的軟件包可以將其作為上述 Boot 方法和軟刪除的替代方法來處理。
寫下來: https : //medium.com/asked-io/cascading-softdeletes-with-laravel-5-a1a9335a5b4d
Laravel/Lumen Soft Cascade 刪除和恢復https://github.com/Askedio/laravel-soft-cascade
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.