При удалении поста Как удалить все связанные комментарии, лайки и уведомления в laravel - PullRequest
1 голос
/ 09 апреля 2019

Я хочу удалить все связанные данные при удалении сообщения.Все комментарии, лайки и все уведомления, связанные с этим постом, также удаляются при удалении этого поста.Как я могу это сделать ?Я делаю это, когда пользователь удаляет все свои сообщения, группы, комментарии и пользователей, о которых сообщают, также удаляется.Вот код этого.Но я также хочу удалить все вещи, связанные с постом, такие как уведомления, лайки и т. Д. Пожалуйста, помогите.

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

Этот код удаляет все, что относится к пользователю, когда пользователь удаляется, но я также хочуудалить все вещи, связанные с постом.Как я могу это сделать?

Ответы [ 2 ]

3 голосов
/ 09 апреля 2019

Вы можете моделировать события , чтобы инициировать действие после удаления записи 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 (при этом используется переменная, определенная в событии :

<?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.
    }
}
1 голос
/ 09 апреля 2019

Вы можете установить в своих миграциях

например. 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();
        // ...
    });

}

или Вы можете управлять Каскадным полиморфным удалением пакета

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...