Laravel / JQGrid - 排序依据 laravel 动态 属性

Laravel / JQGrid - Order by on laravel dynamic property

我目前正在使用免费的 JQGrid 4.6 版本和 Laravel 5.8,我在开发的网格方面遇到了一些问题。所以这里是问题回顾:我想对一些包含来自我的模型 Contact.

动态属性的数据的列进行排序

这是网格的列:

{name: "ID_PROJET", hidden:true},
{name: "DT_REEL_DON", align:'center',formatter:'date',sorttype : 'date', datefmt: 'd/m/Y',formatoptions: {srcformat:'Y-m-d',newformat: "d/m/Y"},excel:true, width:90},
{name:"LIBELLE_PROJ", excel:true,width:250},
{name:"contact.full_identite", excel:true},
{name:"MT_DON",formatter:'currency',align:'right',sorttype:'numeric',excel:true, width:60},
{name:"lib_type_don",excel:true, sortable:false},
{name:"lib_moyen_paiement",excel:true,width:60,sortable:false},
{name:"MAIL", excel:true},
{name:"ADRESSE1", excel:true},
{name:"CDPOST", excel:true,width:50},
{name:"COMMUNE", excel:true},
{name:"PAYS", excel:true,width:70},
{name:"SOLLICITE",excel:true,width:30},
{name: "action",template:"action",sortable:false, width: 75, align:"center",excel:false}  

数据来自我序列化为 JSON 的请求:

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

$sidx$sord$start$limit 是用户在网格上执行操作(分页、排序等)时由 JQGrid 发送的 GET 参数

它运行良好,但问题出在 contact.full_identite 列,它不是我的 contacts table 中的一个字段。这是一个 laravel 动态属性定义如下:

    public function getFullIdentiteAttribute() {
        // si entreprise 
        if ($this->TYPE_CONTACT_ == 1) {
            return $this->ORGANISME;
        }
        // si particulier
        else if ($this->TYPE_CONTACT_ == 2) {
            return $this->NOM . ' ' . $this->PRENOM;
        }
    }

这个想法是 return 如果这是一个特定的人的全名,或者如果这是一家公司的组织名称。 因此,当用户想要对该列进行排序时,我正在寻找一种在该动态属性上应用 orderBy 子句(在我上面的请求中)的方法。目前,我在字段 NOM 上排序,它运行良好,但这不是我期望的结果。

这是我的 contact table 的结构部分的屏幕截图:

在此先感谢您的帮助,如果我不够清楚,请随时向我询问一些细节

如果有人感兴趣,我在 $sidx 属性上添加条件并使用 Laravel sortBysortByDescsplice 方法解决了我的问题。

不确定这是实现它的最佳方式,但这是可行的。

代码:

      if ($sidx == "contact.full_identite") {  
        $dons = $dons->with(['projet','contact'])
        ->join('projet','projet.ID_PROJET',"=",'don.ID_PROJET')
        ->join('contact','contact.ID_CONTACT',"=",'don.ID_CONTACT')
        ->select('don.*','contact.MAIL','contact.ADRESSE1','contact.CDPOST','contact.COMMUNE','contact.PAYS','contact.SOLLICITE','projet.LIBELLE_PROJ')
        ->get();
        if (strtoupper($sord) == "ASC") {
          $dons = $dons->sortBy(function($don) {
            return $don->contact->identite;
          });
        }
        if (strtoupper($sord) == "DESC") {
          $dons = $dons->sortByDesc(function($don) {
            return $don->contact->identite;
          });
        }
        $dons = $dons->splice($start,$limit);
      }