mysql - 根据列值在 Laravel 中自定义排序

标签 mysql sql database laravel eloquent

我想对表格条目进行排序。这是 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 中“完成”(新的在前)

所以让我们假设在数据库中有 15 个条目对应故事的每种状态类型。分页限制设置为 20。

所以这是每个页面的响应

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

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

最佳答案

不理想,但在没有 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) 更快。​​

关于mysql - 根据列值在 Laravel 中自定义排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50758910/

相关文章:

sql - 在 Postgresql 中加入最大记录

mysql - SQL - 价格随时间增加

php - SQL 升级和规则表

mysql - 从重复的 id 中仅获取一个 id(均具有不同的值)并仅使用一个值永久更新唯一 id(应用条件)

mysql - mysql大表numeric类型的快速搜索解决方案?

sql - 如何在多对多查询的一侧找到最小公分母

database - 什么是生产就绪的 NoSQL 数据库?

sql - 在SQL中遍历日期

MySQL - 准备好的语句不返回完整查询

database - 为什么 Postgres 不为我的查询使用更好的索引?