При удалении поста Как удалить все связанные комментарии, лайки и уведомления в laravel

#php #laravel #laravel-5

#php #laravel #laravel-5

Вопрос:

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

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

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

Комментарии:

1. Можете ли вы добавить Post модель, чтобы мы могли видеть, что связано с публикацией.

2. Почему вы не включили ->onDelete('cascade') миграцию? проверьте здесь

3. $table->foreign(‘идентификатор пользователя’) ->references(‘идентификатор’) ->on (‘пользователи’) -> OnDelete (‘каскад’); $table->foreign (‘идентификатор корзины’) ->references(‘идентификатор’) -> on (‘корзины’) -> OnDelete (‘каскад’);

4. Я использую при удалении каскад @JulienMetral

5. В моем посте модель пользователя, корзина и комментарии относятся к @thisiskelvin

Ответ №1:

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

Комментарии:

1. Возможно ли это для полиморфных отношений, потому что с уведомлениями я использую полиморфные отношения @thisiskelvin

2. @Moaiz Я бы предположил, что пока отношения установлены правильно, все должно работать так, как планировалось.

3. Я не нахожу никакого решения по этому поводу.

Ответ №2:

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

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

}
  

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

Комментарии:

1. Есть ли какая-нибудь идея о полиморфных отношениях, потому что я использую полиморфные отношения с уведомлениями? @bhavinjr

2. Еще одна вещь, которую я использую встроенную библиотеку для уведомлений. Есть идеи по поводу того, как также удалить уведомление, если пост удален @bhavinjr

3. если уведомление связано с публикацией, вы можете использовать метод удаления после удаления комментариев. или дайте мне знать вашу модель отношений с уведомлениями

4. trait имеет databasenotifications { /** * Получает уведомления объекта. */ публичная функция notifications() { возвращает $this->morphMany(DatabaseNotification::class, ‘notifiable’) ->OrderBy(‘created_at’, ‘desc’); }

5. Это файл, который создает библиотека уведомлений @bhavinjr