我想在删除帖子时删除所有相关数据。当我删除此帖子时,所有喜欢的评论和与此帖子相关的所有通知也会被删除。我该怎么做?当用户删除他的所有帖子、存储桶、评论和报告的用户也被删除时,我会这样做。这是这个代码。但我也想删除与帖子相关的所有内容,如通知、喜欢等。 请帮忙。
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
模型中,可以添加$dispatchesEvents
属性:
protected $dispatchesEvents = [
'deleting' => AppEventsPostDeleting::class,
];
在此之后,您可以创建新事件:
php artisan make:event PostDeleting
应添加新的事件文件 ( appeventsPostDeleting.php
(。
在这里,您可以定义将传递给事件侦听器的数据。
<?php
namespace AppEvents;
use AppPost;
use IlluminateQueueSerializesModels;
class PostDeleting
{
use SerializesModels;
public $post;
/**
* Create a new event instance.
*
* @param AppPost $post
*/
public function __construct(Post $post)
{
$this->post = $post;
}
}
在此之后,您将需要创建事件侦听器(它将侦听被删除的帖子(:
php artisan event:listener PostDeleting
这将创建一个侦听器 ( app/listeners/PostDeleting.php
(。在这里,您可以定义在删除Post
后运行的功能(这使用事件中定义的变量:
<?php
namespace AppListeners;
use AppEventsPostDeleting as PostDeletingEvent;
class PostDeleting
{
/**
* Handle the event.
*
* @param AppEventsPostDeleting $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();
// ...
});
}
或您可以通过级联多态删除包进行管理