代码之家  ›  专栏  ›  技术社区  ›  Dean

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

  •  1
  • Dean  · 技术社区  · 16 年前

    我正在为我们的cakephpcms开发一个插件,可以处理博客。当获取标签时,我需要将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');
    }
    

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

    当我有unique=>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\u tags表设置为“blog”。“BlogTag”。不是有效的MySQL名称。

    当我删除unique=>正确的关系,所有的工作发现,我可以保存一个标签,但当添加另一个它只是删除第一个,并把新的一个在其位置。

    有人有什么想法吗?是虫子还是我遗漏了什么?

    院长

    1 回复  |  直到 16 年前
        1
  •  0
  •   Leo    15 年前

    院长

    那么你有表blog\u posts\u blog\u 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,
                )
        );
    }