Laravel关联查询如何按ProjectTypeOrder的order字段对ProjectType排序
实现方案
你可以在预加载types关联时传入闭包自定义关联查询逻辑,通过联表关联ProjectTypeOrder后按order字段排序即可,同时保留你原有的images、types.order关联加载需求。
方案1:仅当前查询生效
修改你的查询代码如下:
Project::with([ 'images', 'types' => function ($query) { // 联表关联排序规则,注意替换为你实际的表名、外键字段名 $query->select('project_types.*') // 避免联表后同名字段覆盖 ->join('project_type_orders', 'project_types.id', '=', 'project_type_orders.project_type_id') ->orderBy('project_type_orders.order', 'asc'); // 降序排序改为desc即可 }, 'types.order' ])->get();
方案2:全局关联默认排序
如果所有查询Project的types关联时都需要按这个规则排序,可以直接在Project模型的关联定义中添加排序逻辑,原有查询代码无需修改:
// Project.php 模型文件中 public function types() { return $this->hasMany(ProjectType::class) ->select('project_types.*') ->join('project_type_orders', 'project_types.id', '=', 'project_type_orders.project_type_id') ->orderBy('project_type_orders.order', 'asc'); }
注意事项
- 如果
ProjectTypeOrder模型开启了软删除,需要在联表条件中补充->whereNull('project_type_orders.deleted_at')排除已删除数据 - 注意替换代码中的表名、外键字段为你实际的数据库字段定义
- 如果允许
ProjectType没有关联的ProjectTypeOrder记录,且需要保留这部分数据,将join改为leftJoin即可,避免数据被过滤
内容的提问来源于stack exchange,提问作者treb
相关产品推荐
相关产品推荐

