【问题标题】:Laravel does update instead of deleteLaravel 确实更新而不是删除
【发布时间】:2019-09-06 12:07:37
【问题描述】:

所以我在我的通知电子邮件中添加了一个取消订阅按钮。到目前为止没有问题,直到我尝试执行它。我尝试在 Laravel 的订阅者控制器中添加一个取消订阅方法,但它似乎没有删除我表中的记录。当我尝试删除时,我的表中的记录没有被删除。相反,它会更新我的表格的列。

这是我的表格列:

|编号 |姓名 |电子邮件 |确认令牌 |取消订阅令牌 | created_at |删除_at |

它会在我删除记录时更新删除的列。也就是说,我要删除的记录仍然存在于我的表中,只是更新了删除的那一列。

这里可能出了什么问题?下面提供了代码。我正在使用 Laravel 5.5 和 PyroCMS 3.3。我认为 Pyro 不应该是这里的主要问题,因为这些代码更多地关注 Laravel。

在我的路上

'subscribers/u/{token}/id/{id}' => [
            'as'    => 'sands.module.communications::subscribers.unsubscribe',
            'uses'  => 'Sands\CommunicationsModule\Http\Controller\SubscribersController@unsubscribe'

在我的控制器上:

public function unsubscribe(Request $request, MessageBag $messages, $token, $id)
    {

        $subscriber = SubscriberModel::whereStatus('active')->whereId($id)->whereUnsubscribeToken($token)->first();

        if(empty($token) or empty($subscriber))
        {
            $messages->error(trans('sands.module.communications::addon.subscribers.invalid-confirmation'));
            return redirect(url('/'));
        }

        $subscriber->delete();

        $messages->success(trans('sands.module.communications::addon.subscribers.unsubscribed'));
        return redirect(url('/'));
    }

在我的通知电子邮件中:

public function toMail($notifiable)
    {
    //tender name
    $tender = $this->title;

    //tender url
    $url = url($this->tender->site_link);

    // unsubscribe url
    $url_unsubscribe = route('sands.module.communications::subscribers.unsubscribe', 
    [
        'token' => $this->subscriber->unsubscribe_token, 
        'id' => $this->subscriber->id]);

      return (new MailMessage)
      ->markdown( 'mails.tender', [
          'url'         => $url,
          'url_unsubscribe' => $url_unsubscribe,
          'tender' => $tender] );

任何帮助将不胜感激。

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    这称为“软删除”。默认情况下,软删除的项目将从未来的查询中排除,从而有效地删除它们。

    Laravel docs cover more about soft deletion。您可以使用forceDelete 实际删除表中的行。

    软删除的好处是您最终不会删除将来可能需要的数据。例如,如果有人设法“删除”了您的所有项目,您可以简单地撤消所有“deleted_at”修改,而不必从备份中恢复。

    它还会跟踪项目的删除时间,这对您来说可能是有趣的分析。

    如果你以后想查询包括软删除的项目,你可以使用withTrashed来检索所有的项目,不管deleted_at的值是多少。

    【讨论】:

    • 你已经清楚地回答了我关于 Laravel 的问题。在这种情况下,我真的希望从我的表中删除我的订阅者。我想我需要使用 forceDelete() 才能工作。
    • 太棒了!我已经编辑了我的回复以包含该信息,以防其他人出现。
    【解决方案2】:

    有两种删除类型,一种是永久删除,它会从数据库中删除记录,您将无法再次检索该记录,第二种软删除仅使用当前时间戳更新表中的 deleted_at 列。如果您在模型中使用了该特征,软删除将自动在 laravel 中起作用,但如果您想永久删除它,只需从 laravel 中的模型中删除该特征,它将永久删除该记录。

    【讨论】:

    • 我投票给你是因为你给了我正确的答案,就像上面的评论一样:) 你的评论将来也可能对任何人有用,所以你有一票给我。
    猜你喜欢
    • 2012-02-04
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 2015-12-02
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多