多対多のテーブルで取得できるデータと、片方の外部結合の結果を合わせたようなデータを作りたいです。
処理の重さを考えなければ取得する方法はわかります。
しかし、私が考えた方法では何度もMySQLにリクエストしており無駄が多いです。
件数が少ないうちは良いかもしれませんが、多くなった場合遅延が起こる可能性があります。
実際に実現したい内容については後述しますが、
題記のような処理を1回のリクエスト実現する事は可能なのでしょうか?
実現したい事
トピックとタグの要素があるとします。
次の表のように、トピックの一覧に関連しているタグを付随させたいと考えています。
トピックによっては、タグが無い場合もあります。
トピック | タグ |
---|---|
トピック1 | タグ1、タグ2 |
トピック2 | タグ2 |
トピック3 | |
トピック4 | タグ1 |
テーブル
topicsテーブル
id | title |
---|---|
1 | トピック1 |
2 | トピック2 |
3 | トピック3 |
4 | トピック4 |
tagsテーブル
id | name |
---|---|
1 | タグ1 |
2 | タグ2 |
topic_tagテーブル
中間テーブルです。
topic_id | tag_id |
---|---|
1 | 1 |
1 | 2 |
2 | 2 |
4 | 1 |
自分が思いつく方法
トピックの一覧を取得して、トピック毎にTagを取得する方法が思いつきます。
モデル
Topicモデル
php
1class Topic extends Model 2{ 3 public function tags() { 4 return $this->belongsToMany(Tags::class); 5 } 6}
Tagモデル
php
1class Tag extends Model 2{ 3 public function topics() { 4 return $this->belongsToMany(Topic::class); 5 } 6}
処理
予め保管用の変数を用意しておいて、
topicを全件取得して、それぞれのtopicから紐づくタグを別変数に保持します。
php
1$topics = Topic::all(); 2 3$tags = []; 4foreach($topics as $topic) { 5 $tempTags = $topic->tags() 6 foreach($tempTags as $tag) { 7 $tags[$topic->id] = $tag->name; 8 } 9} 10 11dump($tags);
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/18 12:18
退会済みユーザー
2020/04/18 12:19 編集
2020/04/18 12:31
退会済みユーザー
2020/04/18 12:37 編集
2020/04/18 12:54
退会済みユーザー
2020/04/18 14:04