TYPO3 Extbase存储库查询:如何在M:N关系中查找记录,其中给出了N的多个值?

时间:2013-04-02 21:02:51

标签: typo3 extbase typo3-flow

我们有一个简单的模型 Company 。每个公司可以有一个或多个部门 Dept 。每个部门都是某种类型 Type

现在我们需要一个查询,其中返回所有公司,其中至少有一个X 类型的部门(即每个返回的公司有两个或更多部门,至少一个X和一个Y)。

如何通过查询完成?

如果getTypes返回多个类型,则此查询不会产生任何结果。

if (count($types = $demand->getTypes()) > 0) {
    foreach ($types as $type)
        $constraints[] = $query->contains('dept.type', $type);
}

$result = $query->matching($query->logicalAnd($query->logicalAnd($constraints)))->execute();

此查询返回类型X Y

的结果
if (count($types = $demand->getTypes()) > 0) {
    $constraints[] = $query->in('dept.type', $types);
}

表格如下(简化):

CREATE TABLE IF NOT EXISTS `company` (
  `uid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(128) NOT NULL,
  PRIMARY KEY (`uid`)
);

CREATE TABLE IF NOT EXISTS `dept` (
  `uid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(128) NOT NULL,
  `company` int(10) unsigned NOT NULL,
  `type` int(10) unsigned NOT NULL,
  PRIMARY KEY (`uid`)
);

CREATE TABLE IF NOT EXISTS `type` (
  `uid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(128) NOT NULL,
  PRIMARY KEY (`uid`)
);

2 个答案:

答案 0 :(得分:4)

if (count($types = $demand->getTypes()) > 0) {
    foreach ($types as $type)
        $constraints[] = $query->contains('dept.type', $type);
}

您没有显示进一步处理。

如果您需要AND操作,请使用:

$result = $query->matching($query->logicalAnd($query->logicalAnd($constraints)))->execute();

如果您需要OR操作,请使用:

$result = $query->matching($query->logicalAnd($query->logicalOr($constraints)))->execute();

HTH

答案 1 :(得分:0)

我发现$ query-> contains()仅适用于普通_mm表。

所以这就是我所做的:我刚刚向DB添加了一个视图,其中包含_mm表的必填字段:

CREATE VIEW `company_type_mm` AS
SELECT 
    `company` AS `uid_local`, 
    `type` AS `uid_foreign`,
    0 AS `sorting`,
    0 AS `sorting_foreign` 
FROM `dept`;

然后我将新字段 dept 添加到公司表的TCA中:

'type' => array(
    ...
    'config' => array(
        'foreign_table' => 'type',
        'MM' => 'company_type_mm',
        ...
    )
)

现在我得到了A类型类型B的公司的正确结果:

if (count($types = $demand->getTypes()) > 0) {
    foreach ($types as $type)
        $constraints[] = $query->contains('type', $type);
}