簡體   English   中英

Laravel Eloquent 級聯刪除

[英]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
        });
    }
}

您可以使用“每個” http://laravel.com/docs/eloquent#collections

有一個很好的軟件包可以將其作為上述 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM