Drupal 8 Views自定义排序插件addOrderBy引发SELECT冗余字段问题
Drupal 8 Views自定义排序插件:避免排序公式被自动加入SELECT字段
我之前也踩过这个坑——当用addOrderBy传递NULL和排序公式时,Views会默认把这个公式当成查询字段塞进SELECT列表里,虽然排序功能能正常工作,但额外多出来的字段确实会引发各种麻烦,比如你遇到的DISTINCT相关问题。
解决这个问题的核心就是绕过addOrderBy的自动字段添加逻辑,直接操作查询对象的orderby数组:
// 直接向查询的orderby数组添加自定义排序规则 $this->query->orderby[] = [ 'field' => '(cas.tier IS NULL)', 'direction' => 'ASC', 'alias' => 'some_alias', // 这里的别名仅用于标识排序规则,不会被添加到SELECT中 ];
这样修改之后,生成的SQL就会完全符合你的预期:只会在ORDER BY子句里出现(cas.tier IS NULL) ASC,SELECT列表里不会再多出那个不必要的cas.tier AS some_alias字段。
原理其实很简单:addOrderBy方法内部有个逻辑——如果传入的表名是NULL,就会把你写的公式当成需要查询的字段添加到SELECT中,再用别名来做排序。而直接修改orderby数组,相当于直接告诉Views:我只需要用这个公式做排序,不用把它当成查询字段。
内容的提问来源于stack exchange,提问作者Hubert
相关产品推荐
相关产品推荐

