php 多个join,如何利用join查找多对多关系?

比如我有3张表..

article(id,title,author,content) -文章表

tags(id,name) -标签表

rationship(article_id,tags_id) -文章标签关联表

目的是得到一个结果集,结果集要包含标签.

原来的做法:

$articleList= DB::table('article')->get(); //获取所有文章

//文章信息整理

for($i = 0;$i < count($articleList);$i++){

$artagslist = $articletagsModel->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 < count($articleList);$i++){

$artagslist = $articletagsModel->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操作数据库时拼接起来就行

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值