You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:41:07