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

Laravel 5.8搭配JQGrid 4.6实现Contact模型动态属性排序的问题

排序功能实现方案

Laravel 模型的动态属性(访问器)是查询出数据集后在模型层计算生成的,无法直接用于SQL查询阶段的排序,你可以通过原生SQL的CASE语句模拟访问器的逻辑,在查询时生成对应排序字段即可,代码修改如下:

1. 预处理排序规则

在原有查询前新增排序字段判断逻辑:

use Illuminate\Support\Facades\DB;

// 处理动态属性列排序逻辑
if ($sidx === 'contact.full_identite') {
    $sortField = DB::raw("CASE
        WHEN contact.TYPE_CONTACT_ = 1 THEN contact.ORGANISME
        WHEN contact.TYPE_CONTACT_ = 2 THEN CONCAT(contact.NOM, ' ', contact.PRENOM)
        ELSE ''
    END");
} else {
    $sortField = $sidx;
}

2. 修改查询的排序语句

将原有orderBy($sidx, $sord)替换为适配后的排序逻辑,同时修正原join语句中多余的双引号语法错误:

$dons = $dons->with(['projet','contact'])
     ->join('projet','projet.ID_PROJET','=','don.ID_PROJET')
     ->join('contact','contact.ID_CONTACT','=','don.ID_CONTACT')
     ->orderBy($sortField, $sord)
     ->select('don.*','contact.MAIL','contact.ADRESSE1','contact.CDPOST','contact.COMMUNE','contact.PAYS','contact.SOLLICITE','projet.LIBELLE_PROJ')
     ->offset($start)->limit($limit)->get();

说明

  • 上述SQL逻辑和你定义的getFullIdentiteAttribute访问器逻辑完全一致,排序结果和前端展示的full_identite值完全匹配
  • 新增的ELSE ''可以避免TYPE_CONTACT_为其他值时出现NULL值导致排序异常
  • 该方案在数据库层面完成排序,不影响原有分页逻辑,性能和普通字段排序一致
  • 如果需要兼容姓或名为空的场景,可以把CONCAT替换为CONCAT_WS(' ', contact.NOM, contact.PRENOM),避免空值导致拼接结果异常

内容的提问来源于stack exchange,提问作者skywalskurt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:15:01