首页 > 解决方案 > 尝试对包含多个字符串的列进行排序(我的雇主有一些限制)

问题描述

我在按照雇主希望我的方式对表格列进行排序时遇到一些问题。首先,我使用 If case 和“数据顺序”值对该列进行排序,但我被告知我不应该使用硬编码数字,因为可能存在“大数字问题”或类似的事情。现在我正在寻找另一种解决方案,但我似乎被卡住了:

这是一个有 5 列的表,其中三列中有一对两个数据库字符串。

列是:

“类型” | “工作清单” | “任务名称/任务描述” | “在运行时间/间隔之后” | “下一个到期日期/运行时间”

现在我应该让“After Running hours/Interval”列可排序,结果应该首先显示:每个条目实际上都有一个“After Running hours”条目,升序,其余的应该按间隔长度排序(间隔可以是x day(s), x week(s), x month(s), x year(s) 和两个条目(Interval 和 Running hours)可能是空的,这些情况应该在底部。目前代码如下所示在正确运行时间后排序,但之后它会持续 1 个月 -> 1 周 -> 1 年 -> 2 个月等等。我希望有人能给我一个提示为了解决这个问题,也许使用 {{}} 的隐藏输入可以将天/周/月/年调整为正确的顺序。

            @if($task->worklistTask->running_hours)
                {{$task->worklistTask->running_hours . " h"}} <br>
                @if($task->worklistTask->interval && $task->worklistTask->intervalunit)
                    {{ $task->worklistTask->interval }} {{ $task->worklistTask->intervalunit->name }}
                    @else {{"-"}}
            @endif
            @elseif($task->worklistTask->interval && $task->worklistTask->intervalunit && ($task->worklistTask->intervalunit->name == 'day(s)'))
                {{"-"}} <br> {{ $task->worklistTask->interval }} {{ $task->worklistTask->intervalunit->name }}
            @elseif($task->worklistTask->interval && $task->worklistTask->intervalunit && ($task->worklistTask->intervalunit->name == 'week(s)'))
                {{"-"}} <br> {{ $task->worklistTask->interval }} {{ $task->worklistTask->intervalunit->name }}
            @elseif($task->worklistTask->interval && $task->worklistTask->intervalunit && ($task->worklistTask->intervalunit->name == 'month(s)'))
                {{"-"}} <br> {{ $task->worklistTask->interval }} {{ $task->worklistTask->intervalunit->name }}
            @elseif($task->worklistTask->interval && $task->worklistTask->intervalunit && ($task->worklistTask->intervalunit->name == 'year(s)'))
                {{"-"}} <br> {{ $task->worklistTask->interval }} {{ $task->worklistTask->intervalunit->name }}
                @else {{"-"}} <br> {{"-"}}
            @endif
        </td>

示例表

类型 工作清单 TaskN./TaskDes. ARH
诠释。
Nextdue/ iRH
默认 WLName1 任务1/任务材料 100 小时
1 年
-/-
默认 WLName3 任务4/任务材料 150小时
-
-/-
批判的 WLName3 任务5/任务材料 200
小时 1 周
-/-
默认 WLName1 任务2/任务材料 -
1 个月
-/-
索拉斯 WLName2 任务 3/Taskstuff -
1 周
-/-
默认 WLName4 任务6/Taskstuff -
2 个月
-/-

我们使用 js-table 插件。类型和工作列表完全没有问题(按标题,它会正确排序)“TaskN./TaskDes”。仅按字母顺序对任务名称进行排序,但这对客户来说似乎没有问题。Next due 不能按“inRunningHours”排序,但现在这也不是问题。对 ARH/Int 进行排序。(“运行时间之后”/“间隔”)此刻列正确地对运行时间进行升序排序。之后事情就乱套了。他仍然按字母顺序对“字符串的其余部分”进行排序(没有运行时间值的所有内容都会得到一个“-”,但我需要在间隔长度之后对它们进行排序。

以前的版本是不需要的,现在我正在寻找一个新的解决方案。以前的解决方案:

<td data-order="@if($task->worklistTask->running_hours){{ $task->worklistTask->running_hours }}
                        @elseif (!empty($task->worklistTask->interval) && $task->worklistTask->intervalunit->name == 'day(s)') {{50000 + $task->worklistTask->interval * 1}}
                        @elseif (!empty($task->worklistTask->interval) && $task->worklistTask->intervalunit->name == 'week(s)') {{50000 + $task->worklistTask->interval * 7}}
                        @elseif (!empty($task->worklistTask->interval) && $task->worklistTask->intervalunit->name == 'month(s)') {{50000 + $task->worklistTask->interval * 30}}
                        @elseif (!empty($task->worklistTask->interval) && $task->worklistTask->intervalunit->name == 'year(s)') {{50000 + $task->worklistTask->interval * 365}}
                        @else 999999 @endif">

仍在尝试解决堆栈溢出问题。这只是我第三次在这里发帖。我将尝试改进我的问题的格式。

EDIT2:这(乍一看)似乎符合预期。数据表通常按字母顺序排序,使用此解决方案,我可以按意图进行排序,而无需用户看到我生成的用于对表进行排序的字符串。现在所有运行时间都将在表格顶部,按升序排序“a12345a”,之后所有获得间隔的内容将按间隔长度“b[Intervalindays]b”排序,之后所有没有条目的这两个类别应该列出来。使用 span class=d-none 事物是不可见的,但数据表仍会按字母顺序对字符串进行排序。

<td>
//check if Interval and Running hour entry are available
            @if($task->worklistTask->interval && $task->worklistTask->intervalunit && $task->worklistTask->running_hours)
                <span class="d-none"> {{ "a" }} {{ $task->worklistTask->running_hours }} {{ "a" }} </span> {{ $task->worklistTask->interval }} {{ $task->worklistTask->intervalunit->name }} <br> {{ $task->worklistTask->running_hours}} {{" h"}}
//check if interval entries are available but no running hour entries (depending on interval case)
            @elseif($task->worklistTask->interval && $task->worklistTask->intervalunit && $task->worklistTask->intervalunit->name == 'day(s)')
                <span class="d-none"> {{ "b" }} {{ $task->worklistTask->interval*1 }} {{ "b" }}</span>{{ $task->worklistTask->interval }} {{ $task->worklistTask->intervalunit->name }} <br> {{"-"}}
            @elseif($task->worklistTask->interval && $task->worklistTask->intervalunit && $task->worklistTask->intervalunit->name == 'week(s)')
                <span class="d-none"> {{ "b" }} {{ $task->worklistTask->interval*7 }} {{ "b" }} </span>{{ $task->worklistTask->interval }} {{ $task->worklistTask->intervalunit->name }} <br> {{"-"}}
            @elseif($task->worklistTask->interval && $task->worklistTask->intervalunit && $task->worklistTask->intervalunit->name == 'month(s)')
                <span class="d-none"> {{ "b" }} {{ $task->worklistTask->interval*30 }} {{ "b" }} </span>{{ $task->worklistTask->interval }} {{ $task->worklistTask->intervalunit->name }} <br> {{"-"}}
            @elseif($task->worklistTask->interval && $task->worklistTask->intervalunit && $task->worklistTask->intervalunit->name == 'year(s)')
                <span class="d-none"> {{ "b" }} {{ $task->worklistTask->interval*360 }} {{ "b" }} </span>{{ $task->worklistTask->interval }} {{ $task->worklistTask->intervalunit->name }} <br> {{"-"}}
    //check if there is a running hours entry but no interval entry        
@elseif($task->worklistTask->running_hours)
                <span class="d-none"> {{ "a" }} {{ $task->worklistTask->running_hours }} {{ "a" }} </span>{{ "-" }} <br> {{$task->worklistTask->running_hours}} {{" h"}}
//default if none of the ifs and elseifs fit            
@else
                <span class="d-none"> {{ "c" }} </span> {{ "-" }} <br> {{ "-" }}
            @endif
        </td>

没有大的硬编码数字,事情似乎排序正确。希望我不会错过一些明显的东西,它们会把整个事情分解成碎片。

标签: phplaraveldatatables

解决方案


推荐阅读