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