【问题标题】:Custom Sorting in Laravel depending on column value根据列值在 Laravel 中自定义排序
【发布时间】:2018-11-18 09:54:09
【问题描述】:

我想对表格条目进行排序。这是 Eloquent 模型。

namespace App;

use Illuminate\Database\Eloquent\Model;

/**
 * App\Story
 ...
 * @property string $due_date
 * @property string $status late|scheduled|completed
 ...
 */
class Story extends Model {
    ...
}

我想要返回故事的顺序是:

  • “迟到” 是 ASC(老年人优先)
  • DSC 中的“预定”(新的优先)
  • “完成”在 DSC 中(新的第一)

所以让我们假设每个状态类型的故事在 db 中有 15 个条目。并且分页限制设置为 20。

所以这里是每个页面的响应

  • 首页:按 ASC 顺序排列的 15 个后期故事 + 按 DSC 顺序排列的前 5 个预定故事
  • 第二页:剩余 10 个预定故事 + 前 10 个已完成故事(按 DSC 顺序)
  • 第三页:剩余 5 个已完成的故事

如果上面提供的信息不充分,请告诉我。谢谢!

【问题讨论】:

  • 到目前为止你尝试了什么?
  • @JonasStaudenmeir 我有一个可行的解决方案。但它有两个问题:1. 高度未优化,不适用于更复杂的排序(我们的项目迟早会需要)
  • 所以有效的解决方案是:添加一个数字列 factor 存储 -3 表示迟到,2 表示已安排,1 表示已完成。然后在维护行的同时,在更新类型的值时更新值。查询将是排序时间戳(到期日期)*因子 DSC

标签: mysql sql database laravel eloquent


【解决方案1】:

不理想,但在没有 factor 列的情况下也可以工作:

Story::orderByRaw('FIELD(status, "late", "scheduled", "completed")')
    ->orderByRaw('(CASE WHEN status = "late" THEN 1 ELSE -1 END) * due_date')
    ->paginate(10);

当乘以整数时,due_date 会自动转换为字符串 (20180609)。所以应该比timestamp(due_date)快。

【讨论】:

  • 这正是我想要的。会试一试。谢谢
【解决方案2】:

在某些情况下,您可能希望对特定列使用自定义顺序 sql。为此,您可以使用orderColumn api。

在此示例中,我们将使用 null 作为最后一个结果对列名进行排序。

use DataTables;

Route::get('user-data', function() {
$model = App\User::query();

return DataTables::eloquent($model)
            ->orderColumn('name', '-name $1')
            ->toJson();
});

【讨论】:

  • 嗨,您的回答提到了单列排序。我想考虑两列,第二列的顺序取决于第一列的值。如果您对此有解决方案,请告诉我。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多