TYPO3 Extbase新手求助:获取指定分类下的所有条目
TYPO3 Extbase: 获取指定分类(含子分类)下的所有自定义记录
嘿,刚上手TYPO3和Extbase的时候,分类关联查询确实容易让人摸不着头脑——我当初也在这卡过一阵!咱们一步步拆解你的问题:
第一步:确保模型与分类的关联配置正确
首先得确认你的自定义模型(比如Product.php或者你对应的模型类)已经正确关联了TYPO3的内置分类模型。在模型中添加以下代码:
<?php namespace Vendor\YourExtension\Domain\Model; use TYPO3\CMS\Extbase\Domain\Model\Category; use TYPO3\CMS\Extbase\Persistence\ObjectStorage; class YourModel { /** * 关联的分类 * * @var ObjectStorage<Category> * @TYPO3\CMS\Extbase\Annotation\ORM\Lazy * @TYPO3\CMS\Extbase\Annotation\ORM\ManyToMany(targetEntity="TYPO3\CMS\Extbase\Domain\Model\Category") */ protected $categories; public function __construct() { $this->categories = new ObjectStorage(); } // 添加分类的 getter/setter/adder/remover 方法 public function getCategories(): ObjectStorage { return $this->categories; } public function addCategory(Category $category): void { $this->categories->attach($category); } public function removeCategory(Category $category): void { $this->categories->detach($category); } }
注意:如果是TYPO3 10及以下版本,可能需要用TypoScript配置关联映射,而不是注解。可以在你的扩展
setup.typoscript中添加:config.tx_extbase.persistence.classes { Vendor\YourExtension\Domain\Model\YourModel { mapping { tableName = tx_yourextension_domain_model_yourmodel columns { categories.mapOnProperty = categories categories.fuid = category_uid categories.foreign_table = sys_category } } } }
第二步:实现Repository查询方法
根据你的需求,分两种场景处理:
场景1:仅获取直接属于某个分类的记录
如果只需要获取直接关联到目标分类的记录,Extbase的自动生成方法就可以搞定——只要你的模型里有$categories属性,Repository会自动生成findByCategories()方法。
在控制器中调用:
// 先通过CategoryRepository获取目标分类对象(需要注入CategoryRepository) $targetCategory = $this->categoryRepository->findByUid(2); // 比如塑料椅子的UID是2 // 调用自定义Repository的自动生成方法 $records = $this->yourModelRepository->findByCategories($targetCategory);
场景2:获取分类及其所有子分类下的记录
如果需要包含目标分类的所有子分类(比如获取「损坏椅子」下的轻微、严重、致命损坏椅子的所有记录),就需要自己写自定义查询方法。在你的自定义Repository类中添加:
<?php namespace Vendor\YourExtension\Domain\Repository; use TYPO3\CMS\Extbase\Domain\Model\Category; use TYPO3\CMS\Extbase\Persistence\Repository; class YourModelRepository extends Repository { /** * 获取指定分类及其所有子分类下的记录 * * @param Category $category * @return \TYPO3\CMS\Extbase\Persistence\QueryResultInterface */ public function findByCategoryAndSubcategories(Category $category) { $query = $this->createQuery(); // 递归获取当前分类+所有子分类的UID数组 $categoryUids = $this->getAllSubcategoryUids($category); return $query->matching( $query->in('categories.uid', $categoryUids) )->execute(); } /** * 递归获取分类及其子分类的UID * * @param Category $category * @param array $uids * @return array */ protected function getAllSubcategoryUids(Category $category, array $uids = []) { $uids[] = $category->getUid(); // 遍历子分类递归收集UID foreach ($category->getChildren() as $childCategory) { $uids = $this->getAllSubcategoryUids($childCategory, $uids); } return $uids; } }
然后在控制器中调用这个方法:
$targetCategory = $this->categoryRepository->findByUid(你的分类UID); $records = $this->yourModelRepository->findByCategoryAndSubcategories($targetCategory);
关键注意事项
- 确保你的自定义记录已经通过TYPO3后台正确关联了分类,检查
sys_category_record_mm表中是否有对应的关联数据。 - 如果查询结果为空,先排查分类UID是否正确,以及模型/Repository的命名空间、类名是否一致。
- TYPO3 11+版本推荐使用注解配置关联,而不是TypoScript,记得清除缓存后测试。
内容的提问来源于stack exchange,提问作者philipp
相关产品推荐
相关产品推荐

