[英]When deleting the post How to delete all related comments , likes and notifications in laravel
我想删除帖子时删除所有相关数据。 当我删除此帖子时,所有喜欢的评论和与此帖子相关的所有通知也会被删除。 我怎样才能做到这一点 ? 当用户删除其所有帖子,存储桶,评论和报告的用户时,我也会这样做。 这是此代码。 但我也想删除与该帖子相关的所有内容,例如通知,喜欢等。请帮助。
public function destroy($id)
{
$user = User::find($id);
$user->posts()->forceDelete();
$user->buckets()->forceDelete();
$user->comments()->forceDelete();
$user->reportedUser()->forceDelete();
$user->forceDelete();
return redirect()->route('users.index')->with('Success','User Deleted Successfully');
}
这段代码删除了删除用户时与用户有关的所有东西,但我也想删除与帖子有关的所有东西。 我该怎么做?
您可以对事件建模,以在删除过Post
记录Post
触发操作。 在您的Post
模型中,您可以添加$dispatchesEvents
属性:
protected $dispatchesEvents = [
'deleting' => \App\Events\PostDeleting::class,
];
之后,您可以创建新事件:
php artisan make:event PostDeleting
应该添加一个新的事件文件( app\\events\\PostDeleting.php
)。
在这里,您可以定义将传递给事件侦听器的数据。
<?php
namespace App\Events;
use App\Post;
use Illuminate\Queue\SerializesModels;
class PostDeleting
{
use SerializesModels;
public $post;
/**
* Create a new event instance.
*
* @param \App\Post $post
*/
public function __construct(Post $post)
{
$this->post = $post;
}
}
之后,您将需要创建事件侦听器 (它将侦听要删除的帖子):
php artisan event:listener PostDeleting
这将创建一个侦听器( app/listeners/PostDeleting.php
)。 在这里,您定义了删除Post
立即运行的功能(它使用在event中定义的变量:
<?php
namespace App\Listeners;
use App\Events\PostDeleting as PostDeletingEvent;
class PostDeleting
{
/**
* Handle the event.
*
* @param \App\Events\PostDeleting $event
* @return mixed
*/
public function handle(PostDeletingEvent $event)
{
$event->user->likes()->delete(); // or whatever relation you need to delete.
}
}
您可以设置迁移
例如comments
迁移
$table->foreign('post_id')
->references('id')
->on('posts')
->onDelete('cascade');
无需编写任何其他逻辑。 您可以在关系迁移中编写类似的内容
对于多态关系,例如
Post Model
protected static function boot()
{
parent::boot();
static::deleting(function ($post) {
$post->comments()->delete();
// ...
});
}
或者您可以通过Cascade多态删除程序包进行管理
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.