比如我有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操作資料庫時拼接起來就行