首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

TYPO3扩展库:筛选1:N关系

在TYPO3中,处理1:N关系(即一个父记录与多个子记录之间的关系)通常涉及到使用数据库表和模型。TYPO3扩展库(如EXT:news)提供了处理这些关系的工具和方法。以下是一个基本的指南,展示如何在TYPO3扩展中筛选1:N关系。

1. 定义数据库表和模型

首先,你需要定义数据库表和相应的模型来表示1:N关系。例如,假设你有一个Parent记录和一个Child记录,每个Parent可以有多个Child

数据库表

代码语言:javascript
复制
CREATE TABLE tx_myextension_parent (
    uid int(11) NOT NULL AUTO_INCREMENT,
    title varchar(255) DEFAULT '' NOT NULL,
    PRIMARY KEY (uid)
);

CREATE TABLE tx_myextension_child (
    uid int(11) NOT NULL AUTO_INCREMENT,
    parent_uid int(11) DEFAULT '0' NOT NULL,
    title varchar(255) DEFAULT '' NOT NULL,
    PRIMARY KEY (uid),
    KEY parent_uid (parent_uid)
);

TYPO3模型

代码语言:javascript
复制
namespace MyVendor\MyExtension\Domain\Model;

use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;

class Parent extends AbstractEntity
{
    /**
     * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\MyVendor\MyExtension\Domain\Model\Child>
     */
    protected $children = null;

    public function getChildren()
    {
        return $this->children;
    }

    public function setChildren(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $children)
    {
        $this->children = $children;
    }
}

class Child extends AbstractEntity
{
    /**
     * @var int
     */
    protected $parentUid = 0;

    public function getParentUid()
    {
        return $this->parentUid;
    }

    public function setParentUid($parentUid)
    {
        $this->parentUid = $parentUid;
    }
}

2. 创建Repository

接下来,创建一个Repository来处理数据的CRUD操作和筛选。

代码语言:javascript
复制
namespace MyVendor\MyExtension\Domain\Repository;

use TYPO3\CMS\Extbase\Persistence\Repository;

class ParentRepository extends Repository
{
    public function findByParentUid($parentUid)
    {
        $query = $this->createQuery();
        $query->matching(
            $query->equals('parentUid', $parentUid)
        );
        return $query->execute();
    }
}

3. 使用Repository

在你的控制器或服务中,使用Repository来获取筛选后的数据。

代码语言:javascript
复制
namespace MyVendor\MyExtension\Controller;

use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;
use MyVendor\MyExtension\Domain\Model\Parent;
use MyVendor\MyExtension\Domain\Repository\ParentRepository;

class ParentController extends ActionController
{
    protected $parentRepository;

    public function injectParentRepository(ParentRepository $parentRepository)
    {
        $this->parentRepository = $parentRepository;
    }

    public function listAction()
    {
        $parentUid = 1; // 示例父记录UID
        $parents = $this->parentRepository->findByParentUid($parentUid);

        $this->view->assign('parents', $parents);
    }
}

4. 在模板中显示数据

最后,在你的模板中显示筛选后的数据。

代码语言:javascript
复制
<f:for each="{parents}" as="parent">
    <h2>{parent.title}</h2>
    <ul>
        <f:for each="{parent.children}" as="child">
            <li>{child.title}</li>
        </f:for>
    </ul>
</f:for>

通过以上步骤,你可以在TYPO3扩展中处理和筛选1:N关系。确保你的数据库表和模型正确设置,并使用Repository来处理数据的筛选和检索。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 需求分析

    在ChatGPT 火热的当下, 即使没有上手亲自体验,想必也对ChatGPT的强大略有耳闻。当一些人在对ChatGPT犹犹豫豫之时,一些敏锐的企业主和开发者们已经急不可耐的开展基于ChatGPT模型AI应用的落地探索。 因此,可以明确预见的是,AI 能力的集成将会是很多应用都将面临的第一事项,而拥有相关性技能的人才屈指可数。而这,正是机会所在,而机会是留给有准备之人,因此,有幸看到本文的开发者们,开始考虑面向AI编程吧。 即使当下的公司没有相关的机会,也可以着手一些相关的知识储备,比如学习如何写得一手好的Prompt,了解一下目前主流的面向AI编程的开发框架,比如Python技术栈的LangChain,.NET技术栈的Semantic Kernal。 而本文就来简单梳理什么是Semantic Kernal,可以基于Semantic Kernal 做什么?

    03
    领券