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;
#.....
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
关系: 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


