1

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

现在我们需要查询返回所有公司,其中至少有一个 X 类型的部门一个 Y 类型的部门(即每个返回的公司有两个或多个部门,至少一个 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();

此查询返回 XY类型的结果

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`)
);
4

2 回答 2

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();

高温高压

于 2013-04-24T13:44:51.447 回答
0

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

所以这就是我所做的:我刚刚向数据库添加了一个视图,其中包含 _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`;

然后我在company表的 TCA 中添加了一个新字段dept :

'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);
}
于 2013-04-30T00:53:45.840 回答