在cakephp插件中使用HABTM关系,将unique设置为false

时间:2010-03-24 10:28:53

标签: cakephp plugins

我正在开发一个用于处理博客的CakePHP CMS的插件。在获取标签时,我需要将HABTM关系设置为unique = false,以便能够将标签添加到帖子而无需全部重置。

BlogPost模型看起来像这样

class BlogPost extends AppModel {
    var $name = 'BlogPost';
    var $actsAs = array('Core.WhoDidIt', 'Containable');
    var $hasMany = array('Blog.BlogPostComment');
    var $hasAndBelongsToMany = array('Blog.BlogTag' => array('unique' => false), 'Blog.BlogCategory');
}

BlogTag模型看起来像这样

class BlogTag extends AppModel {
    var $name = 'BlogTag';
    var $actsAs = array('Containable');
    var $hasAndBelongsToMany = array('Blog.BlogPost');
}

当我拥有unique =>时出现的SQL错误BlogPost和BlogTag之间的HABTM关系中的真实设置是

Query: SELECT `Blog`.`BlogTag`.`id`, `Blog`.`BlogTag`.`name`, `Blog`.`BlogTag`.`slug`, `Blog`.`BlogTag`.`created_by`, `Blog`.`BlogTag`.`modified_by`, `Blog`.`BlogTag`.`created`, `Blog`.`BlogTag`.`modified`, `BlogPostsBlogTag`.`blog_post_id`, `BlogPostsBlogTag`.`blog_tag_id` FROM `blog_tags` AS `Blog`.`BlogTag` JOIN `blog_posts_blog_tags` AS `BlogPostsBlogTag` ON (`BlogPostsBlogTag`.`blog_post_id` = 4 AND `BlogPostsBlogTag`.`blog_tag_id` = `Blog`.`BlogTag`.`id`)

正如您所看到的,它正在尝试将blog_tags表设置为'Blog'。'BlogTag。这不是一个有效的MySQL名称。

当我删除unique =>从所有工作的关系中找到真实的,我可以保存一个标签,但是当添加另一个标签时,它只删除第一个标签并将新标签放置到位。

有没有人有任何想法?这是一个错误还是我错过了什么?

干杯, 迪安

1 个答案:

答案 0 :(得分:0)

迪安

那么你有表blog_posts_blog_tags吗?

引用关于HABTM关系的CakePHP文献

  

我们需要在数据库中设置一个额外的表来处理HABTM关联。这个新的连接表的名称需要包括所涉及的两个模型的名称,按字母顺序排列,并用下划线(_)分隔。

所以(为了便于阅读,删除了博客位!)你需要你的帖子表,你的标签表和你的posts_tags表,然后是HABTM定义

class Post extends AppModel {
    var $name = 'Post';   
    var $hasAndBelongsToMany = array(
        'Tag' =>
            array(
                'className'              => 'Tag',
                'joinTable'              => 'posts_tags',
                'foreignKey'             => 'post_id',
                'associationForeignKey'  => 'tag_id',
                'unique'                 => true,
            )
    );
}