3月 16
cakePHP的HABTM的确让人头痛,不是使用上的,而是效率。比方:
关系: Article HABTM Tag ,
现在我在首页列出十条最新的Article,需要包括他的tag。
SQL语句将是像这样的:

SELECT Article.* FROM articles AS Article ;
SELECT * FROM tags AS Tag LEFT JOIN articles_tags ON articles_tags.article_id = 1 AND articles_tags.tag_id = Tag.id;
SELECT * FROM tags AS Tag LEFT JOIN articles_tags ON articles_tags.article_id = 2 AND articles_tags.tag_id = Tag.id;
#.....
 

很不好意思,上面的代码我手写的,不是直接copycake生成的代码(生成的query太长了。)关系误写成了left join,实际上是join。这个错误给老王造成了不少麻烦,在这里向他道歉了。

SQL的查询次数将是:
1 + HABTM数目 * 第一次查询的放回结果数
以上列子则为 11条。

另外如果我需要按Tag来分页显示所有的Article,在cakePHP中还没有可以直接使用的语句。

$articleMode->findAll("Tag.name='$tag'"); #没有Tag表联立,SQL语句错误
$tagModel->findAll('Tag.name'); # 将没有limit可以设置,不能翻页到第二页
 

所以,放弃cakePHP的HABTM 关系,使用hasMany && belongsTo来替代。在控制上要麻烦一些,但效率可控性上要强的多。
现在的关系为:
Article hasMany ArticlesTag
ArticleTag belongsTo Tag
Defined tags for this entry: ,

作者 rollenc

Bookmark 重新调整Model,忽略cake的HABTM关系  at del.icio.us Digg 重新调整Model,忽略cake的HABTM关系 Mixx 重新调整Model,忽略cake的HABTM关系 Bloglines 重新调整Model,忽略cake的HABTM关系 Technorati 重新调整Model,忽略cake的HABTM关系 Fark this: 重新调整Model,忽略cake的HABTM关系 Bookmark 重新调整Model,忽略cake的HABTM关系  at YahooMyWeb Bookmark 重新调整Model,忽略cake的HABTM关系  at Furl.net Bookmark 重新调整Model,忽略cake的HABTM关系  at reddit.com Bookmark 重新调整Model,忽略cake的HABTM关系  at blinklist.com Bookmark 重新调整Model,忽略cake的HABTM关系  at Spurl.net Bookmark 重新调整Model,忽略cake的HABTM关系  at NewsVine Bookmark 重新调整Model,忽略cake的HABTM关系  at Simpy.com Bookmark 重新调整Model,忽略cake的HABTM关系  at blogmarks Bookmark 重新调整Model,忽略cake的HABTM关系  with wists Bookmark 重新调整Model,忽略cake的HABTM关系  at Ma.gnolia.com wong it! Bookmark using any bookmark manager! Stumble It!