删除帖子时 如何删除所有相关评论 ,喜欢和通知在 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模型中,可以添加$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();
        // ...
    });
}

或您可以通过级联多态删除包进行管理

最新更新