代码之家  ›  专栏  ›  技术社区  ›  fefe

使用Spaties QueryBuilder对关系进行排序

  •  1
  • fefe  · 技术社区  · 2 年前

    有了以下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 工作不正常

    0 回复  |  直到 2 年前