#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