联接不用于复杂的HABTM搜索CakePhp 2

时间:2017-08-21 10:06:33

标签: cakephp has-and-belongs-to-many cakephp-2.3

我有内容,可以有属于不同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

1 个答案:

答案 0 :(得分:0)

我在分页类的内容中进行了一项研究,我的结论是,它根本无法使用当前的Paginator,因为我无法传递我对这个复杂查询所需的特殊连接。

自定义查找类型也无济于事,因为我的查询过于动态。

如果有人证明我错了,我将是一个快乐的程序员。