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
相关产品推荐
相关产品推荐

