覆盖 Laravel Nova 删除操作

时间:2021-02-15 23:23:37

标签: laravel laravel-nova

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

Action selection from Nova documentation

action 的 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 操作。

相关问题