Laravel中如何通过hasManyThrough关联表的order字段排序projectDocuments
解决方案
首先请确保你的project_document_order表已存在用于排序的order整型字段,以下是几种可行实现方案:
方案1:关联定义全局生效
所有查询projectDocuments关联的场景都会自动按排序字段排序,修改关联定义即可:
public function projectDocuments(){ return $this->hasMany( ProjectDocuments::class, 'project_id' ) ->join('project_document_order', 'project_document.id', '=', 'project_document_order.project_document_id') ->select('project_document.*') // 指定查询主表字段,避免关联表字段冲突覆盖 ->orderBy('project_document_order.order', 'asc'); // 升序用asc,倒序改为desc }
方案2:单次查询临时生效
仅当前查询按排序规则处理,不影响其他业务的关联调用,修改查询语句即可:
Project::where( 'id', $pid ) ->with([ 'projectDocuments' => function($query) { $query->join('project_document_order', 'project_document.id', '=', 'project_document_order.project_document_id') ->select('project_document.*') ->orderBy('project_document_order.order', 'asc'); }, 'projectDocumentOrder' ]) ->firstOrFail();
补充方案(小数据量场景适用)
无需修改SQL,在集合层面做排序,首先需要先给ProjectDocuments模型添加一对一关联:
// ProjectDocuments模型中新增关联 public function projectDocumentOrder() { return $this->hasOne(ProjectDocumentOrder::class, 'project_document_id'); }
查询后直接调用集合方法排序即可:
$project = Project::where( 'id', $pid )->with('projectDocuments.projectDocumentOrder', 'projectDocumentOrder')->firstOrFail(); $sortedDocuments = $project->projectDocuments->sortBy(fn($item) => $item->projectDocumentOrder->order);
注意事项
- 如果存在未关联
project_document_order记录的文档,需要保留这些数据的话把join改为leftJoin,无排序记录的文档默认排在最前,如需调整可以追加orderByRaw('ISNULL(project_document_order.order) ASC')把无排序的放到最后 - 注意代码中的表名要和你实际数据库的表名保持一致,避免SQL执行报错
内容的提问来源于stack exchange,提问作者VMeijer
相关产品推荐
相关产品推荐

