【问题标题】:when i delete post(campaign) , payments that related to the deleted campaign still in the DB , i want to delete it also. (laravel,controller)当我删除帖子(广告系列)时,与已删除广告系列相关的付款仍在数据库中,我也想将其删除。 (laravel,控制器)
【发布时间】:2020-06-05 10:16:06
【问题描述】:

需要帮助

当我从我的众筹平台删除一个活动时,如果该活动已经有一些付款,我会收到一个错误,

没有活动的付款仍在数据库中 所以我的付款列表视图中出现错误。我唯一的解决方案是转到数据库并删除属于已删除广告系列的付款。

当我删除广告系列时,它也必须删除他自己的付款

  • 活动控制器(删除功能):
    public function deleteCampaigns($id = 0){
        if(config('app.is_demo')){
            return redirect()->back()->with('error', __('app.feature_disable_demo'));
        }

        if ($id){
            $campaign = Campaign::find($id);
            if ($campaign){
                $campaign->delete();
            }
        }
        return back()->with('success', trans('app.campaign_deleted'));
    }

数据库中的每笔付款都与活动表中的 campaign_id 相关

【问题讨论】:

    标签: php laravel eloquent controller php-carbon


    【解决方案1】:

    如果您在 Campaign 模型上正确设置了 toMany 关系,那么您可以在该关系上调用 delete(),如果没有额外的限制,它应该会删除所有相关的付款。

    所以假设与付款的 toMany 关系称为payments 那么:

    if ($campaign){
      $campaign->payments()->delete();
      $campaign->delete();
    }
    

    编辑:

    根据 Alex Mac 在评论中提到的内容,这可能是也可能不是解决您的问题的最佳解决方案,尽管我相信这是最直接的答案。阅读Question上的答案

    【讨论】:

    • 这行得通。但是,我强烈建议您更好地构建迁移结构。这样您就不必记住每次需要删除广告系列时都删除每个关系。您正在为其他开发人员打开可能滥用您的模型并搞砸数据库的大门。
    • @AlexMac 我同意您提到的其他方法,但是也存在对该方法的担忧,例如,如果 OP 实际上是软删除他的模型,则不会通过迁移进行级联删除工作。我已经编辑了我的答案以在另一个问题帖子中显示讨论。
    • 有很多包在级联上进行软删除。但是,OP 没有提到这一点和laravel-news.com/cascading-soft-deletes。因此,是的,根据您的用例使用正确的工具。然后我会推荐一些函数或方法来在一行中处理这种情况。而不是允许潜在的错误。
    • 根据Documentation,laravel 实际上本机支持软删除,如果您通读我编辑的答案链接上的答案和 cmets,有些人还提出级联删除实际上不是一些数据库支持。因此,尽管我同意存在潜在的误用,但建议进行级联删除可能根本不起作用,具体取决于 OP 的设置。
    • 这是我的观点,但是 Laravel 开箱即用地支持软删除。这就是为什么由于我们不知道有关 OP 设置的更多信息,我只是给出了直截了当的答案,并在您的评论之后将他们重定向到其他问题,以便就该主题进行全面讨论,并让他们决定:)
    【解决方案2】:

    您可以在迁移中创建外键约束。例如,

    $table->foreign('campaign_id') ->references('id')->on('payments') ->onDelete('cascade');

    所以当你删除一个活动时,它会删除它的支付外键约束模型或更容易说它雄辩的 hasMany 关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      相关资源
      最近更新 更多