Laravel 5.5:如何让关联模型优先于无关联模型并按关联金额排序
解决方案
要实现有关联数据的模型排在无关联模型之前,同时保持关联模型按total_rl1的排序规则,只需在现有排序逻辑前增加一层对total_rl1是否为空的判断排序即可。
修改后的代码:
$models = $this->models->withCount([ 'rl1 as total_rl1' => function ($query) { $query->select(\DB::raw('sum(rl1.amount)')); }, 'rl1', 'rl2', ]); foreach ($columnToSearch as $column) { $models = $models->where($column, 'ILIKE', '%' . $term . '%'); } // 先按total_rl1是否为空排序:非空在前,空在后 $models = $models ->orderByRaw('total_rl1 IS NULL ASC') ->orderBy($sortBy, $sortOrder) ->paginate($perPage); $models->appends([ 'per-page' => $perPage, 'sort-by' => $sortBy, 'sort-order' => $sortOrder, 'term' => $term ]);
逻辑说明:
orderByRaw('total_rl1 IS NULL ASC'):数据库中total_rl1为NULL(无关联)的记录会被标记为1,非空(有关联)的标记为0。按升序排序时,0会排在1前面,从而实现有数据的模型优先。- 后续的
orderBy($sortBy, $sortOrder)会保持关联模型按total_rl1(或其他指定字段)的原有排序规则。
效果验证:
修改后查询结果会变为:
array[ record3: [total_rl1 => 20], record4: [total_rl1 => 15], record5: [total_rl1 => 10], record1: no relation, record2: no relation, ]
内容的提问来源于stack exchange,提问作者Seto
相关产品推荐
相关产品推荐

