2007/03 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: ,

Posted by rollenc

0 Trackbacks

  1. No Trackbacks

1 Comments

Display comments as(Linear | Threaded)
  1. sss6859 says:

    你的博客,我们是看不懂了,hoho

    Comments ()

Add Comment


You can use [geshi lang=lang_name [,ln={y|n}]][/lang] tags to embed source code snippets
E-Mail addresses will not be displayed and will only be used for E-Mail notifications