【问题标题】:Override Laravel Nova delete action覆盖 Laravel Nova 删除操作
【发布时间】:2021-02-15 23:23:37
【问题描述】:

我有一个 Laravel Nova 后端,我希望用户能够通过过滤器选择删除大量记录。这些记录也与其他模型有一些关系,需要清理。 例如,管理员可能想要删除所有没有任何角色的用户,并将他们从他们所在的组中分离出来,并删除他们发布的所有帖子。这可能是大约 25000 个用户。

在我看来,由于过滤器的选择,Nova 正在逐行处理此请求,最终导致服务器超时。 我想向数据库发送查询以删除所有 id 在过滤器选择中的用户。 MySQL 将通过级联处理关系的删除。这比 Nova 的逐行处理要快得多。

但我不知道如何覆盖 Nova 对删除请求的处理。我设法得到的最接近的方法是利用模型的删除事件,但到那时 Nova 已经在逐行处理请求。 我如何为这个请求连接我自己的控制器?

【问题讨论】:

    标签: laravel laravel-nova


    【解决方案1】:

    不要覆盖删除,而是创建一个action 来完成这项工作。

    过滤并选择用户列表(或您需要删除的任何模型)后,从下拉列表中调用操作。在 Nova 文档的屏幕截图中,他们有一个“电子邮件帐户配置文件”操作。

    动作的handle 方法被传递给选定模型的集合

    /**
    * Perform the action on the given models.
    *
    * @param  \Laravel\Nova\Fields\ActionFields  $fields
    * @param  \Illuminate\Support\Collection  $models
    * @return mixed
    */
    public function handle(ActionFields $fields, Collection $models)
    {
        foreach ($models as $model) {
          ...
    

    您可以遍历集合删除每一个,也可以使用模型键构建 SQL 查询并一次性删除它们。

    如果您想在后台处理操作以避免超时,您甚至可以queue 操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      • 2016-09-25
      • 2014-12-04
      • 1970-01-01
      • 2014-04-21
      相关资源
      最近更新 更多