我们有一个简单的模型 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`)
);
答案 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);
}