TYPO3 Extbase多对多关联:如何覆盖MM表排序按子表字段排序?
TYPO3 Extbase多对多关联按子表字段排序的解决方案
问题核心
Extbase处理m:n关联时,默认会优先使用MM表的sorting字段排序关联集合——即便你在Repository配置defaultOrderings或TCA设置foreign_default_sortby,前端详情页仍会按MM表排序展示,而非子表的nachname字段。
有效解决方法
方法1:修改实体类关联注解(推荐)
在主表实体类(如Anlage.php)的关联属性上添加@ORM\OrderBy注解,直接指定按子表nachname字段排序:
/** * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Vendor\AlpintecBaustelle\Domain\Model\Kontakte> * @ORM\ManyToMany(targetEntity="\Vendor\AlpintecBaustelle\Domain\Model\Kontakte", joinTable="tx_alpintecbaustelle_anlage_kontakte_mm") * @ORM\OrderBy({"nachname" = "ASC"}) */ protected $kontakte;
注意替换Vendor\AlpintecBaustelle为你实际的扩展命名空间。
方法2:在Repository中手动排序关联集合
如果不想修改实体注解,可在主表Repository的查询方法中,获取主实体后对关联集合手动排序:
public function findByUid($uid) { $query = $this->createQuery(); $query->matching($query->equals('uid', $uid)); $anlage = $query->execute()->getFirst(); if ($anlage instanceof \Vendor\AlpintecBaustelle\Domain\Model\Anlage) { // 将集合转为数组并按nachname排序 $kontakteArray = $anlage->getKontakte()->toArray(); usort($kontakteArray, function($a, $b) { return strcmp($a->getNachname(), $b->getNachname()); }); // 重新封装为ObjectStorage $sortedKontakte = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage(); foreach ($kontakteArray as $kontakt) { $sortedKontakte->attach($kontakt); } $anlage->setKontakte($sortedKontakte); } return $anlage; }
原方法无效的原因
- Repository的
defaultOrderings中kontakte.nachname仅作用于主表查询的关联条件排序,不影响关联集合自身的加载排序逻辑; - TCA的
foreign_default_sortby仅控制后端选择框内的选项排序,对前端Extbase查询返回的关联集合无影响。
内容的提问来源于stack exchange,提问作者Andreas K
相关产品推荐
相关产品推荐

