有了以下QueryBuilder语句,我如何定义相关模型列的排序?
$members = QueryBuilder::for(Member::class)
->allowedIncludes('user.name', 'association', 'affiliate')
->with('user')
->allowedFilters([
AllowedFilter::exact('association.id'),
AllowedFilter::partial('zip'),
AllowedFilter::exact('specialisations.id')
])
->allowedSorts(['user.name', 'zip'])
->where('published', 1);
在这种情况下,模型Member与User相关,我希望按User模型名称排序。声明排序用例
allowedSorts(['user.name'])
不会起作用。
然后我实现了Sort接口来创建一个自定义排序关系,如下所示
$members = QueryBuilder::for(Member::class)
->with('user')
->allowedIncludes(['user', 'association', 'affiliate'])
->allowedFilters([
AllowedFilter::exact('association.id'),
AllowedFilter::partial('zip'),
AllowedFilter::exact('specialisations.id')
])
->allowedSorts(
AllowedSort::custom("user.name", new SortByRelation()),
'zip'
)
->where('published', 1);
自定义排序如下
public function __invoke(Builder $query, bool $descending, string $property)
{
[$relationName, $columnName] = explode(".", $property);
$relation = $query->getRelation($relationName);
$subQuery = $relation
->getQuery()
->select($columnName)
->whereColumn($relation->getQualifiedForeignKeyName(), $relation->getQualifiedOwnerKeyName());
$query->orderBy($subQuery, $descending ? "desc" : "asc");
}
它处理一个排序的列,但如果我对两者都进行排序,只有一个主题会得到正确的排序。
sort=zip,user.name
工作不正常