【问题标题】:CakePHP: difference between backtick query and normal queryCakePHP:反引号查询和普通查询的区别
【发布时间】:2016-07-15 05:34:18
【问题描述】:

我的 CakePHP 应用程序中有 3 个博客表,它们与遵循 CakePHP 命名约定的 HABTM 关联链接:posts - post_tag_links - tags。

我尝试获取一个包含所有链接到特定标签(例如“设计”)的帖子的数组。这个查询对我有用:

$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 中如何留下这些反引号?

谢谢 ;)

【问题讨论】:

    标签: mysql cakephp backticks


    【解决方案1】:

    反引号很可能不是问题,因为它们所做的只是转义标识符。顺便说一句,这很容易找到。

    实际问题更有可能是您以错误的方式定义了条件,您在那里所做的是创建字符串文字比较条件,即

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

    id 列值与字符串PostTagLink.post_id 进行比较当然会失败。

    定义标识符比较的正确方法是将条件片段提供为单个值而不是键 => 值集,即

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

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

    另见

    【讨论】:

    • 我很高兴你能这么快地帮助我,因为我已经找了很长时间了。非常感谢ndm!
    猜你喜欢
    • 2020-02-09
    • 1970-01-01
    • 2019-01-20
    • 2013-06-20
    • 2019-11-21
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多