TYPO3中基于IRRE关联子表条件查询父表记录的实现问题
TYPO3 Extbase IRRE关联查询解决方案
问题1:查询子记录无法获取父记录uid字段
原因
子记录TCA中parent字段配置为passthrough类型,Extbase的属性映射机制默认会跳过该类型字段,哪怕模型中添加了get/set方法也无法正常读取字段值。
修复步骤
- 修改子记录TCA的
parent字段配置:
'parent' => [ 'label' => '关联父记录', 'config' => [ 'type' => 'select', 'renderType' => 'selectSingle', 'foreign_table' => 'tx_你的扩展标识_domain_model_父表名', // 替换为实际父表表名 'readOnly' => true, // 不需要手动编辑可设为只读 ], ],
- 在子记录的Domain模型中添加父关联属性及对应方法:
/** * @var \你的Vendor名\你的扩展标识\Domain\Model\父模型类名 */ protected $parent = null; public function getParent(): ?\你的Vendor名\你的扩展标识\Domain\Model\父模型类名 { return $this->parent; } public function setParent(?\你的Vendor名\你的扩展标识\Domain\Model\父模型类名 $parent): void { $this->parent = $parent; }
- 清除TYPO3全部缓存后,查询子记录即可通过
$child->getParent()->getUid()获取父记录uid。
问题2:父表侧关联子表按子字段筛选查询
不需要手动编写join逻辑,Extbase支持直接通过关联属性的点语法自动生成关联查询,前提是父模型已配置正确的子记录关联属性:
步骤1:确认父模型关联配置
父模型中需定义子记录的ObjectStorage关联:
use TYPO3\CMS\Extbase\Persistence\ObjectStorage; /** * @var ObjectStorage<\你的Vendor名\你的扩展标识\Domain\Model\子模型类名> * @TYPO3\CMS\Extbase\Annotation\ORM\Cascade("remove") */ protected $children = null; public function __construct() { $this->children = new ObjectStorage(); } public function getChildren(): ObjectStorage { return $this->children; } public function setChildren(ObjectStorage $children): void { $this->children = $children; }
步骤2:修改Repository查询方法
use TYPO3\CMS\Extbase\Persistence\QueryInterface; public function getParentsByFilter($mainCondition, $subCondition) { $parentQuery = $this->createQuery(); $parentQuery->matching( $parentQuery->logicalAnd( $parentQuery->equals('parent_field', $mainCondition), // 直接用 关联属性名.子字段名 即可访问子表字段,Extbase自动生成join $parentQuery->equals('children.children_field', $subCondition) ) ); $parentQuery->setOrderings(['crdate' => QueryInterface::ORDER_DESCENDING]); $querySettings = $parentQuery->getQuerySettings(); $querySettings->setRespectStoragePage(false); // 关联子表可能返回重复父记录,开启去重 $querySettings->setDistinct(true); return $parentQuery->execute(); }
如果需要手动控制join逻辑,可使用Query的join方法:
$parentQuery->join( 'tx_你的扩展标识_domain_model_子表名', // 子表表名 'child', // 子表别名 \TYPO3\CMS\Extbase\Persistence\Generic\Qom\JoinInterface::JOIN_TYPE_INNER, $parentQuery->equals('current.uid', 'child.parent') // 关联条件,current为父表默认别名 );
内容的提问来源于stack exchange,提问作者Bernd Wilke πφ
相关产品推荐
相关产品推荐

