CakePHP: разница между запросом с обратной кавычкой и обычным запросом

У меня есть 3 таблицы блогов в моем приложении CakePHP, которые связаны с ассоциацией HABTM в соответствии с соглашениями об именах CakePHP: сообщения - post_tag_links - теги.

Я пытаюсь получить массив со всеми сообщениями, которые связаны с определенным тегом (например, «дизайн»). Этот запрос работает для меня:

$this->Post->query("
    SELECT
        Post.id, Post.title FROM posts AS Post
    LEFT JOIN
        post_tag_links AS PostTagLink ON Post.id = PostTagLink.post_id
    LEFT JOIN
        tags AS Tag ON Tag.id = PostTagLink.tag_id
    WHERE
        Tag.slug = 'design'
    GROUP BY
        Post.id"
);

Затем CakePHP генерирует следующий запрос и дает мне 4 результата:

SELECT
    Post.id,
    Post.title 
FROM
    posts AS Post 
LEFT JOIN
    post_tag_links AS PostTagLink 
        ON Post.id = PostTagLink.post_id 
LEFT JOIN
    tags AS Tag 
        ON Tag.id = PostTagLink.tag_id 
WHERE
    Tag.slug = 'design' 
GROUP BY
    Post.id

НО... чтобы попрактиковаться, лучше не использовать метод "запрос". Итак, я попробовал метод «найти все»:

$this->Post->find('all', array(
    'fields' => array(
        'Post.id',
        'Post.title'
    ),
    'joins' => array(
        array(
            'table' => 'post_tag_links',
            'alias' => 'PostTagLink',
            'type' => 'LEFT',
            'conditions' => array(
                'Post.id' => 'PostTagLink.post_id'
            )
        ),
        array(
            'table' => 'tags',
            'alias' => 'Tag',
            'type' => 'LEFT',
            'conditions' => array(
                'Tag.id' => 'PostTagLink.tag_id',
            )
        )
    ),
    'conditions' => array(
        'Tag.slug' => 'design'
    ),
    'group' => 'Post.id'
    )
));

Затем CakePHP генерирует следующий запрос и не дает ни одного результата:

SELECT
    `Post`.`id`,
    `Post`.`title` 
FROM
    `kattenbelletjes`.`posts` AS `Post` 
LEFT JOIN
    `kattenbelletjes`.`post_tag_links` AS `PostTagLink` 
        ON (
            `Post`.`id` = 'PostTagLink.post_id'
        ) 
LEFT JOIN
    `kattenbelletjes`.`tags` AS `Tag` 
        ON (
            `Tag`.`id` = 'PostTagLink.tag_id'
        ) 
WHERE
    `Tag`.`slug` = 'design' 
GROUP BY
    `Post`.`id

После множества проб и ошибок я обнаружил, что проблема заключается в обратных кавычках, которые CakePHP создает при построении этого последнего запроса.

Мой вопрос: в чем разница между запросом с обратными кавычками и запросом без обратных кавычек? И как вы можете оставить эти обратные кавычки в CakePHP?

Спасибо ;)


person Sam    schedule 28.03.2016    source источник


Ответы (1)


Обратные кавычки, скорее всего, не проблема, поскольку все, что они делают, — это экранирование идентификаторов. Кстати, это довольно легко найти.

Фактическая проблема, скорее всего, в том, что вы неправильно определили условия, то, что вы там делаете, создает условия сравнения строковых литералов, т.е.

`Post`.`id` = 'PostTagLink.post_id'

Сравнение значения столбца id со строкой PostTagLink.post_id, конечно, не удастся.

Правильный способ определения сравнений идентификаторов состоит в том, чтобы предоставить фрагмент условия в виде одного значения вместо набора ключей => значений, т.е.

'conditions' => array(
    'Post.id = PostTagLink.post_id'
)

и

'conditions' => array(
    'Tag.id = PostTagLink.tag_id'
)

Смотрите также

person ndm    schedule 28.03.2016
comment
Я рад, что вы смогли помочь мне так быстро, потому что я искал его довольно долго. Большое спасибо ндм! - person Sam; 28.03.2016