如何利用join查找多对多关系?
article(id,title,author,content) -文章表
tags(id,name) -标签表
rationship(article_id,tags_id) -文章标签关联表
目的是得到一个结果集,结果集要包含标签.
原来的做法:
$articleList= DB::table('article')->get(); //获取所有文章
//文章信息整理
for($i = 0;$i getRelateTags($articleList[$i]->id);//获取关系表中对应文章id的所有标签id
if(isset($artagslist)) {
$tagsArray = array();
foreach ($artagslist as $values) {
//遍历标签id,从标签表中查找结果..
$singletags = $tagsModel->getTagsById($values->tags_id);
//把结果追加到数组$tagsArray中..
array_push($tagsArray, $singletags);
}
$articleList[$i]->tags = $tagsArray; //在最开始的数据增加一个字段保存标签数组
}
}
最后得到的数组如下:
array:1 [▼
0 => {#176 ▼
+"id": "1"
+"title": "这是标题"
+"author": "这是作者"
+"content": "这是文章正文"
+"tags": array:2 [▼
0 => {#182 ▼
+"id": 5
+"name": "nodejs"
+"create_time": null
+"update_time": null
+"user_id": null
+"num": 1
}
1 => {#183 ▼
+"id": 4
+"name": "python"
+"create_time": null
+"update_time": null
+"user_id": null
+"num": 1
}
]
}
]
虽然我原来的做法也可以达到目的,但是总觉得这种做法有点冗余,所以想问问有没有更好的办法?或者说可以直接用SQL一句话解决这个问题。谢谢!
回复内容:
比如我有3张表..
article(id,title,author,content) -文章表
tags(id,name) -标签表
rationship(article_id,tags_id) -文章标签关联表
目的是得到一个结果集,结果集要包含标签.
原来的做法:
$articleList= DB::table('article')->get(); //获取所有文章
//文章信息整理
for($i = 0;$i getRelateTags($articleList[$i]->id);//获取关系表中对应文章id的所有标签id
if(isset($artagslist)) {
$tagsArray = array();
foreach ($artagslist as $values) {
//遍历标签id,从标签表中查找结果..
$singletags = $tagsModel->getTagsById($values->tags_id);
//把结果追加到数组$tagsArray中..
array_push($tagsArray, $singletags);
}
$articleList[$i]->tags = $tagsArray; //在最开始的数据增加一个字段保存标签数组
}
}
最后得到的数组如下:
array:1 [▼
0 => {#176 ▼
+"id": "1"
+"title": "这是标题"
+"author": "这是作者"
+"content": "这是文章正文"
+"tags": array:2 [▼
0 => {#182 ▼
+"id": 5
+"name": "nodejs"
+"create_time": null
+"update_time": null
+"user_id": null
+"num": 1
}
1 => {#183 ▼
+"id": 4
+"name": "python"
+"create_time": null
+"update_time": null
+"user_id": null
+"num": 1
}
]
}
]
虽然我原来的做法也可以达到目的,但是总觉得这种做法有点冗余,所以想问问有没有更好的办法?或者说可以直接用SQL一句话解决这个问题。谢谢!
sql恐怕做不了多次嵌套,如果你只是要文章的tag还好,同时还要tag关联的文章列表就不行了。
不过通常没有这种需求吧?页面上列出所有文章很常见,提供文章的简要内容很常见,列出文章的tag也很常见,但是同时把tag相关的文章列出来的就没见过了。你应该根据最终的显示是否需要来考虑sql的优化,而不是力求把所有数据都读出来。
另外,从你列出的数据来看,tag有个名字足够了,创建时间修改时间创建者之类的这种东西真的没用,如果不是有的框架对id有强制要求,这个表的id都没用。
如果需要tag相关的文章建议用ajax去二次获取,文章使用的tag可以考虑使用mysql的group_conact(好像是吧,懒的去查了),作用是把group by分组的内容连接成字符串。例如
select articles.*, group_conact(tag
.name
, ', ') from articles left join tags ...
具体的自己查mysql手册吧。
select ar.*,t.* from article as ar left join relationship as rs on ar.id = rs.article_id left join tags as t on rs.tags_id =t.id
,这是sql语句,调用model操作数据库时拼接起来就行
推荐阅读
-
python使用ORM之如何调用多对多关系
-
Laravel5 的多对多关系中,在 blade 模板里面如何循环输出其中一张表的字段,而且输出其关联对应的另外一张表的字段
-
使用 doctrine orm 如何在程序逻辑上实现在一张表完成两个外键的设置(或则说一个实体完成两个多对一的关系)?
-
laravel多对多查询,不用join,用model,如何查,愁哭了
-
Laravel5 的多对多关系中,在 blade 模板里面如何循环输出其中一张表的字段,而且输出其关联对应的另外一张表的字段
-
Php如何展示一对多的关系?
-
如何利用join查找多对多关系?
-
Php如何展示一对多的关系?
-
Laravel的多对多关系模型如何在分布式的情况下使用,比如用户表在另一台服务器?
-
Laravel的多对多关系模型如何在分布式的情况下使用,比如用户表在另一台服务器?