在TYPO3中,处理1:N关系(即一个父记录与多个子记录之间的关系)通常涉及到使用数据库表和模型。TYPO3扩展库(如EXT:news)提供了处理这些关系的工具和方法。以下是一个基本的指南,展示如何在TYPO3扩展中筛选1:N关系。
首先,你需要定义数据库表和相应的模型来表示1:N关系。例如,假设你有一个Parent
记录和一个Child
记录,每个Parent
可以有多个Child
。
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)
);
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;
}
}
接下来,创建一个Repository来处理数据的CRUD操作和筛选。
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();
}
}
在你的控制器或服务中,使用Repository来获取筛选后的数据。
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);
}
}
最后,在你的模板中显示筛选后的数据。
<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来处理数据的筛选和检索。
领取专属 10元无门槛券
手把手带您无忧上云