【问题标题】:When deleting the post How to delete all related comments , likes and notifications in laravel删除帖子时如何删除laravel中的所有相关评论,喜欢和通知
【发布时间】:2019-08-30 11:09:00
【问题描述】:

我想在删除帖子时删除所有相关数据。当我删除此帖子时,所有与此帖子相关的 cmets 喜欢和所有通知也会被删除。我怎样才能做到这一点 ?当用户删除他所有的帖子、存储桶、cmets 时,我会这样做,并且报告的用户也会被删除。这是此代码。但我也想删除所有与帖子相关的内容,如通知、点赞等。请帮忙。

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 模型,以便我们查看与帖子相关的内容。
  • 为什么没有在迁移时设置->onDelete('cascade')?检查here
  • $table->foreign('user_id') ->references('id') ->on('users') ->onDelete('cascade'); $table->foreign('bucket_id') ->references('id') ->on('buckets') ->onDelete('cascade');
  • 我在删除级联时使用@JulienMetral
  • 在我的帖子模型用户中,bucket 和 cmets 相关 @thisiskelvin

标签: php laravel laravel-5


【解决方案1】:

您可以在迁移中设置

例如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();
        // ...
    });

}

或 可以通过Cascade polymorphic delete包管理

【讨论】:

  • 是否有关于多态关系的任何想法,因为我使用通知的多态关系? @bhavinjr
  • 还有一件事我使用内置库进行通知。如果帖子已删除@bhavinjr,任何关于删除通知的想法
  • 如果通知与post相关,则可以在cmets删除后使用delete方法。或者让我知道您的通知模型关系
  • trait HasDatabaseNotifications { /** * 获取实体的通知。 */ public function notifications() { return $this->morphMany(DatabaseNotification::class, 'notifiable') ->orderBy('created_at', 'desc'); }
  • 这是通知库创建的文件@bhavinjr
【解决方案2】:

一旦Post 记录被删除,您可以model events 触发操作。在您的 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 后运行的功能(这使用 event 中定义的变量:

<?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.
    }
}

【讨论】:

  • 多态关系是否可能,因为通知我使用多态关系@thisiskelvin
  • @Moaiz 我猜只要关系设置正确,它应该按计划工作。
  • 我没有找到任何解决方案。
猜你喜欢
  • 2014-08-02
  • 2021-04-06
  • 2017-07-03
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
相关资源
最近更新 更多