如何在Typo3默认仓储函数中对员工数据设置指定字段排序?
如何在仓储层实现多字段升序排序
嘿,看了你的代码和需求,刚好这类多字段排序的场景在领域仓储里很常见,给你梳理两种直接可行的方案:
1. 利用仓储默认的findAll()扩展参数
从你的代码来看,你用的是ItemRepository这类领域仓储,通常它如果继承了框架的基础仓储类(比如Flow的AbstractRepository),findAll()方法是支持传入排序参数的。你可以直接修改调用代码,把排序规则传进去:
public function listAction() { $arguments = $this->request->getArguments(); // 按姓名升序,再按部门、薪资升序排序 $employees = $this->itemRepository->findAll(null, [ 'name' => \TYPO3\Flow\Persistence\QueryInterface::ORDER_ASCENDING, 'department' => \TYPO3\Flow\Persistence\QueryInterface::ORDER_ASCENDING, 'salary' => \TYPO3\Flow\Persistence\QueryInterface::ORDER_ASCENDING ]); $this->view->assign('employees', $employees); }
这里第一个参数是过滤条件(传null表示不做过滤,返回所有数据),第二个参数就是排序规则数组——按你要求的优先级,先排姓名,再排部门,最后排薪资,全部用升序。
这种方式不需要修改仓储类,直接用默认方法就能实现,是最快捷的方案。
2. 自定义仓储查询方法(更优雅的封装)
如果你想把这个排序逻辑固定下来,避免在控制器里重复写排序规则,也可以在ItemRepository里新增一个自定义方法:
// 在你的ItemRepository类中添加这个方法 public function findAllSortedByNameDepartmentSalary() { $query = $this->createQuery(); $query->setOrderings([ 'name' => \TYPO3\Flow\Persistence\QueryInterface::ORDER_ASCENDING, 'department' => \TYPO3\Flow\Persistence\QueryInterface::ORDER_ASCENDING, 'salary' => \TYPO3\Flow\Persistence\QueryInterface::ORDER_ASCENDING ]); return $query->execute(); }
然后在控制器里直接调用这个封装好的方法:
public function listAction() { $arguments = $this->request->getArguments(); $employees = $this->itemRepository->findAllSortedByNameDepartmentSalary(); $this->view->assign('employees', $employees); }
小提醒
- 要确保排序用的字段名和你实体类里的属性名完全一致(比如姓名对应
name,部门对应department,薪资对应salary,别写错拼写) - 如果你的框架不是Flow,排序常量或者方法名可能会有小差异,但核心逻辑都是通过查询构建器设置多字段的排序优先级
内容的提问来源于stack exchange,提问作者Karthik
相关产品推荐
相关产品推荐

