You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 08:40:49