You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel Voyager中对含子元素的模型进行浮点型排序?

解决Laravel Voyager后台浮点型排序的方案

你需要在Voyager后台实现基于浮点型order字段的父子层级排序,以下是具体可行的实现方式:

1. 自定义模型查询作用域

在你的模型中添加自定义排序作用域,强制使用浮点类型处理排序逻辑,绕过Voyager默认的整型限制:

public function scopeOrdered($query)
{
    // 按浮点型order字段排序,保留层级排序逻辑
    return $query->orderByRaw('`order` + 0 ASC');
}

之后在Voyager的BREAD配置中,将排序字段指定为order,后台列表加载时会自动应用这个作用域。

2. 重写Voyager排序逻辑(进阶)

如果需要更灵活的控制,可复制Voyager核心的ListController到项目的app/Http/Controllers/Voyager目录下,修改其中的排序处理代码:
找到控制器中处理排序的代码段,替换为直接使用order字段排序,去掉原有的整型转换限制:

// 替换原排序判断代码
if ($sortColumn) {
    $query->orderBy($sortColumn, $sortDirection);
}

最后修改Voyager的路由配置,指向你自定义的控制器,避免官方更新覆盖修改。

3. 调整BREAD配置

在Voyager后台的BREAD编辑页面,完成两个关键设置:

  • Sort Column:选择你的order字段
  • Sort Direction:设置为ASC(符合"1.1,1.2,2.1..."的层级升序逻辑)

4. 优化层级显示(可选)

如果要在后台列表直观展示父子层级的缩进效果,可在模型中添加自定义属性:

public function getIndentedTitleAttribute()
{
    // 根据order字段的小数点数量生成缩进
    $level = substr_count((string)$this->order, '.');
    $indent = str_repeat('    ', $level);
    return $indent . $this->title;
}

之后在BREAD的列表字段中,使用indented_title代替原title字段,就能看到带缩进的层级结构。


内容的提问来源于stack exchange,提问作者sundowatch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 18:57:05