我有一个 Laravel Nova 后端,我希望用户能够在其中通过过滤器选择删除大量记录。这些记录与其他模型也有一些关系,需要清理。 例如,管理员可能想要删除所有没有任何角色的用户,并将他们从他们所在的组中分离出来,并删除他们发表的所有帖子。这可能是大约 25000 个用户。
在我看来,由于选择了过滤器,Nova 正在逐行处理此请求,最终导致服务器超时。 我想向数据库发送一个查询,以删除所有 id 在过滤器选择中的用户。 MySQL 将通过级联处理关系的删除。这比Nova的逐行处理要快得多。
但我不知道如何覆盖 Nova 对删除请求的处理。我设法获得的最接近的是利用模型的删除事件,但到那时 Nova 已经在逐行处理请求。 我如何为这个请求连接我自己的控制器?
答案 0 :(得分:0)
不是覆盖删除而是创建一个 action 来完成这项工作。
过滤并选择用户列表(或您需要删除的任何模型)后,从下拉列表中调用操作。在这个来自 Nova 文档的屏幕截图中,他们有一个“电子邮件帐户配置文件”操作。
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 操作。