mysql - 具有两级关系的流明排序

标签 mysql laravel lumen

这是一个任务管理器网络应用

我有 3 个表任务输入

inputs 表具有 order 列,用于选择首先显示哪一列

有许多任务

输入有许多任务

因此每个任务都有一个输入和一个

我想按 row_id 对任务进行排序,然后按 input.order

第一次尝试

App\Row::with(['user', 'tasks', 'tasks.option', 'tasks.input'])
  ->orderBy('rows.id', 'ASC', 'order', 'ASC')
  ->get(); 

它忽略顺序

结果

[
    {
        "id": 1,
        "user_id": 1,
        "created_at": "2018-06-07 18:40:23",
        "updated_at": "2018-06-07 18:40:23",
        "tasks": [
            {
                "id": 1,
                "row_id": 1,
                "input_id": 1,
                "option_id": 1,
                "value": null,
                "input": {
                    "id": 1,
                    "name": "assigned to",
                    "type": 1,
                    "value": "mario",
                    "required": 1,
                    "order": 2,
                    "user_id": 1,
                    "created_at": "2018-06-07 18:40:16",
                    "updated_at": "2018-06-08 10:08:19"
                }
            },
            {
                "id": 2,
                "row_id": 1,
                "input_id": 2,
                "option_id": null,
                "value": "test new option",
                "input": {
                    "id": 2,
                    "name": "test new option",
                    "type": 0,
                    "value": "test new option",
                    "required": 0,
                    "order": 3,
                    "user_id": 1,
                    "created_at": "2018-06-07 18:40:44",
                    "updated_at": "2018-06-08 10:08:19"
                }
            },
            {
                "id": 3,
                "row_id": 1,
                "input_id": 3,
                "option_id": null,
                "value": "2018-07-01",
                "input": {
                    "id": 3,
                    "name": "deadline",
                    "type": 3,
                    "value": "2018-07-01",
                    "required": 0,
                    "order": 4,
                    "user_id": 1,
                    "created_at": "2018-06-08 10:07:37",
                    "updated_at": "2018-06-08 10:08:19"
                }
            },
            {
                "id": 4,
                "row_id": 1,
                "input_id": 4,
                "option_id": null,
                "value": "",
                "input": {
                    "id": 4,
                    "name": "priority",
                    "type": 6,
                    "value": "",
                    "required": 0,
                    "order": 1,
                    "user_id": 1,
                    "created_at": "2018-06-08 10:08:19",
                    "updated_at": "2018-06-08 10:08:19"
                }
            }
        ]
    }
]

第二次尝试

App\Row::with(['user', 'tasks', 'tasks.option', 'tasks.input'])
  ->orderBy('rows.id', 'ASC')
  ->orderBy('order', 'ASC')
  ->get(); 

但它产生了一个错误

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'order' in 'order clause' (SQL: select * from `rows` order by `rows`.`id` asc, `order` asc)

第三次尝试

App\Row::with([
  'user', 
  'tasks', 
  'tasks.option', 
  'tasks.input' => 
    function($query) {
        $query->orderBy('order', 'ASC');
    }
  ])
  ->orderBy('rows.id', 'ASC')
  ->get();

它忽略与第一个相同的订单结果

第四次尝试

    return App\Row::with(['user', 'tasks', 'tasks.option', 'tasks.input'])
        ->join('tasks', 'rows.id', '=', 'tasks.row_id')
        ->join('inputs', 'inputs.id', '=', 'tasks.input_id')
        ->orderBy('rows.id', 'ASC')
        ->orderBy( 'inputs.order', 'ASC')
        ->get();

它为每一列生成行,而不是像它想象的那样生成行

结果

[
    {
        "id": 4,
        "user_id": 1,
        "created_at": "2018-06-08 10:08:19",
        "updated_at": "2018-06-08 10:08:19",
        "row_id": 1,
        "input_id": 4,
        "option_id": null,
        "value": "",
        "name": "priority",
        "type": 6,
        "required": 0,
        "order": 1,
        "tasks": []
    },
    {
        "id": 1,
        "user_id": 1,
        "created_at": "2018-06-07 18:40:16",
        "updated_at": "2018-06-08 10:08:19",
        "row_id": 1,
        "input_id": 1,
        "option_id": 1,
        "value": "mario",
        "name": "assigned to",
        "type": 1,
        "required": 1,
        "order": 2,
        "tasks": [
            {
                "id": 1,
                "row_id": 1,
                "input_id": 1,
                "option_id": 1,
                "value": null,
                "input": {
                    "id": 1,
                    "name": "assigned to",
                    "type": 1,
                    "value": "mario",
                    "required": 1,
                    "order": 2,
                    "user_id": 1,
                    "created_at": "2018-06-07 18:40:16",
                    "updated_at": "2018-06-08 10:08:19"
                }
            },
            {
                "id": 2,
                "row_id": 1,
                "input_id": 2,
                "option_id": null,
                "value": "test new option",
                "input": {
                    "id": 2,
                    "name": "test new option",
                    "type": 0,
                    "value": "test new option",
                    "required": 0,
                    "order": 3,
                    "user_id": 1,
                    "created_at": "2018-06-07 18:40:44",
                    "updated_at": "2018-06-08 10:08:19"
                }
            },
            {
                "id": 3,
                "row_id": 1,
                "input_id": 3,
                "option_id": null,
                "value": "2018-07-01",
                "input": {
                    "id": 3,
                    "name": "deadline",
                    "type": 3,
                    "value": "2018-07-01",
                    "required": 0,
                    "order": 4,
                    "user_id": 1,
                    "created_at": "2018-06-08 10:07:37",
                    "updated_at": "2018-06-08 10:08:19"
                }
            },
            {
                "id": 4,
                "row_id": 1,
                "input_id": 4,
                "option_id": null,
                "value": "",
                "input": {
                    "id": 4,
                    "name": "priority",
                    "type": 6,
                    "value": "",
                    "required": 0,
                    "order": 1,
                    "user_id": 1,
                    "created_at": "2018-06-08 10:08:19",
                    "updated_at": "2018-06-08 10:08:19"
                }
            }
        ]
    },
    {
        "id": 2,
        "user_id": 1,
        "created_at": "2018-06-07 18:40:44",
        "updated_at": "2018-06-08 10:08:19",
        "row_id": 1,
        "input_id": 2,
        "option_id": null,
        "value": "test new option",
        "name": "test new option",
        "type": 0,
        "required": 0,
        "order": 3,
        "tasks": []
    },
    {
        "id": 3,
        "user_id": 1,
        "created_at": "2018-06-08 10:07:37",
        "updated_at": "2018-06-08 10:08:19",
        "row_id": 1,
        "input_id": 3,
        "option_id": null,
        "value": "2018-07-01",
        "name": "deadline",
        "type": 3,
        "required": 0,
        "order": 4,
        "tasks": []
    }
]

这个文件是here

完整代码是here

最佳答案

因为它搜索表中的列,而不是输入中的列。

  App\Row::with(['user', 'tasks', 'tasks.option', 'tasks.input'=> function ($q){
        $q->orderBy('order', 'ASC'); // order from "rows" table
    }])
  ->orderBy('id', 'ASC') // id from "rows" table
  ->get(); 

关于mysql - 具有两级关系的流明排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50758938/

相关文章:

asp.net 4.0 Web 服务无法在服务器上运行;有人可以校对代码吗?

php - mysql 在一个字段中插入多个值

mysql - 复制具有重要关系的关系数据

php - 检查数据库是否可用

laravel - GET 请求结果导致 Lumen 8 中出现 CORS 错误

queue - 带有数据库驱动程序的 Lumen 队列作业不会填充表作业

css - Lumen - 设置 Sass

php - 警告:mysqli_query()至少需要2个参数,第3行的D:\XAMPP\htdocs\***\includes\users.php中给出1个参数。

php - 存储 html 模板的最佳方式 (Laravel 5)

laravel - 设计 Laravel 缓存(Redis)架构