簡體   English   中英

如何在Laravel 5.5中刪除多關系模型

[英]How to delete multi relationship Model in Laravel 5.5

我有3張桌子

圖書 :-ID-名稱-Deleted_at

帖子 :-id-book_id-內容-Deleted_at

評論 :-id-post_id-評論-Deleted_at

一本書有很多帖子,一則帖子有很多評論。

刪除圖書時,我想刪除與該圖書相關的帖子和​​評論。 我已經在所有模型中添加關系,所有表都使用SoftDelete,並嘗試在Laravel中使用Event

// Book Model
protected static function boot() {
    parent::boot();
    static::deleting(function($book) {
         $book->posts()->delete();
    });
}

// Post Model
protected static function boot() {
    parent::boot();
    static::deleting(function($post) {
         $post->comments()->delete();
    });
}

當我嘗試刪除一本書時:

$book = Book:find($bookId);
$book->delete()

書籍和帖子,已刪除,但評論未刪除。 我可以使用Laravel Event刪除評論嗎? 感謝您的閱讀!

您將在Post模型的delete事件內傳遞一個不同的變量。

// Post Model
protected static function boot() {
    parent::boot();
    static::deleting(function($post) {
         // $book->comments()->delete();
         $post->comments()->delete();
    });
}

您應該將模型關系的ON DELETE觸發器設置為CASCADE。 否則,您將需要迭代相關記錄並單獨刪除它們。

$model->related->each(function ($related) { $related->delete(); });

編輯:您對模型事件有正確的主意,但請先刪除帖子,然后向后退到書籍

protected static function boot() {
    parent::boot();

    static::deleting(function($post) {
        $post->comments()->delete();
    });
}

確保所有模型都具有軟刪除特征和日期屬性:

 use SoftDeletes;
protected $dates = ['deleted_at'];

您可以使用michaeldyrynda制作的這種巧妙的小特征,稱為laravel-cascade-soft-deletes。

GitHub自述文件中的示例代碼:

<?php

namespace App;

use App\Comment;
use Iatstuti\Database\Support\CascadeSoftDeletes;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Post extends Model
{
    use SoftDeletes, CascadeSoftDeletes;

    protected $cascadeDeletes = ['comments'];

    protected $dates = ['deleted_at'];

    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
}    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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