如何在Laravel 5.5

时间:2018-01-18 09:20:13

标签: php laravel laravel-5 laravel-5.5 laravel-eloquent

我有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删除评论吗? 感谢阅读!

3 个答案:

答案 0 :(得分:0)

您正在Post模型的删除事件中传递一个不同的变量。

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

答案 1 :(得分:0)

您应该将模型关系设置为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'];

答案 2 :(得分:0)

你可以使用michaeldyrynda制作的这个简洁的小特性,称为laravel-cascade-soft-deletes。

GitHub readme的示例代码:

<?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);
    }
}