我有内容,可以有属于不同TagGroup的标签。我有一个非常复杂的搜索条件,如下所示: 如果内容与搜索中的至少一个标记标记,只要它属于同一标记组,则匹配。
实施例: TagGroup 1是颜色,TagGroup2是形状。 因此,如果内容标有"蓝色","绿松石"和"矩形"当我搜索" blue"和"矩形" 然而,这个例子只是为了表明这背后的逻辑非常复杂。
内容 - > ContentsTag< - 标签 - > TagGroup
我想开发一个搜索,其中包含我所使用的结果的分页,但是在重构和框架更新之间,它被破坏了。
在某些时候,我丢失了连接的信息,所以我的SQL崩溃了,因为它丢失了表。
array(
'limit' => (int) 10,
'order' => array(
'Content.objnbr' => 'asc'
),
'joins' => array(
(int) 0 => array(
'table' => 'sang_contents_tags',
'alias' => 'CT1', //join for the first TagGroup
'type' => 'INNER',
'conditions' => array(
(int) 0 => 'CT1.content_id = Content.Id'
)
),
(int) 1 => array(
'table' => 'sang_contents_tags',
'alias' => 'CT2', //join for the second TagGroup
'type' => 'INNER',
'conditions' => array(
(int) 0 => 'CT2.content_id = Content.Id'
)
)
),
'conditions' => array(
'AND' => array(
(int) 0 => array(
'OR' => array(
(int) 0 => array(
'CT1.tag_id' => '189' // chosen Tag 1 from the first TagGroup
)
)
),
(int) 1 => array(
'OR' => array(
(int) 0 => array(
'CT2.tag_id' => '7' // chosen Tag 2 from the second TagGroup
)
)
)
)
),
'contain' => array(
(int) 0 => 'Description',
'ContentsTag' => array(
'Tag' => array(
(int) 0 => 'Taggroup'
)
)
)
)
产生以下SQL:
SELECT `Content`.`id`, `Content`.`objnbr`, `Content`.`name`, `Content`.`imagecounter`, `Content`.`videolength`, `Content`.`money_maker`, `Content`.`comment`
FROM `my_db`.`contents` AS `Content`
WHERE ((`CT1`.`tag_id` = '189') AND (`CT2`.`tag_id` = '7'))
ORDER BY `Content`.`id` DESC
LIMIT 20
很明显,标签CT1和CT2没有连接,我的sql崩溃了。
可能是包含阻塞连接吗?如果我取消设置包含,我仍会得到相同的结果/错误。
有什么想法吗?
编辑:澄清一下,我想要实现的目标: 结果应该是这样的SQL语句:
SELECT `Content`.`id`, `Content`.`objnbr`, `Content`.`name`, `Content`.`imagecounter`, `Content`.`videolength`, `Content`.`money_maker`, `Content`.`comment`
FROM
`my_db`.`contents` AS `Content`
INNER JOIN
contents_tags AS CT1 ON CT1.content_id = Content.Id
INNER JOIN
contents_tags AS CT2 ON CT2.content_id = Content.Id
WHERE
((`CT1`.`tag_id` = '189')
AND (`CT2`.`tag_id` = '7'))
ORDER BY `Content`.`id` DESC
LIMIT 10
看起来麻烦是由分页造成的。如果我做一个"简单"找到我根据标签获取内容:
$result = $this->Content->find('all', $this->paginate['Content']);
通过find生成查询:
SELECT
`Content`.`id`,
`Content`.`objnbr`,
`Content`.`name`,
`Content`.`imagecounter`,
`Content`.`videolength`,
`Content`.`money_maker`,
`Content`.`comment`
FROM
`my_db`.`contents` AS `Content`
INNER JOIN
`my_db`.`contents_tags` AS `CT0` ON (`CT0`.`content_id` = `Content`.`Id`)
INNER JOIN
`my_db`.`contents_tags` AS `CT2` ON (`CT2`.`content_id` = `Content`.`Id`)
WHERE
((`CT0`.`tag_id` = '56')
AND (`CT2`.`tag_id` = '7'))
ORDER BY `Content`.`objnbr` ASC
答案 0 :(得分:0)
我在分页类的内容中进行了一项研究,我的结论是,它根本无法使用当前的Paginator,因为我无法传递我对这个复杂查询所需的特殊连接。
自定义查找类型也无济于事,因为我的查询过于动态。
如果有人证明我错了,我将是一个快乐的程序员。