前提
今回は下記項目を登録する想定で書いてます。
(商品に複数のタグを登録できる多対多の関係)
- 商品
- タグ
やりたいこと
- 注目タグ(商品に登録されている数の多いタグ)を作成したい
- 注目タグを商品に登録されている数の多い順に表示させたい
最初に
- 商品一覧と、それに紐づくタグを表示させるページを作成する
- ひとつの商品に、複数のタグを登録できるものとする
- 商品(items)テーブル、タグ(tags)テーブル、中間テーブル(item_tag)を作成・使用
- 商品(items)モデル、タグ(tags)モデルを作成・使用
DB
items | tags | item_tag |
---|---|---|
id | id | id |
name | name | item_id |
created_at | created_at | tag_id |
updated_at | updated_at |
Model
Item.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Item extends Model
{
public function tag(){
return $this->belongsToMany('App\Tag', 'item_tag', 'item_id', 'tag_id');
}
}
Tag.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Tag extends Model
{
public function item(){
return $this->belongsToMany('App\Item', 'item_tag', 'tag_id', 'item_id');
}
}
実装
IndexController.php
<?php
namespace App\Http\Controllers\Index;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Item;
use App\Tag;
class TopController extends Controller
{
public function index()
{
$items = Item::get();
//withCountメソッドでリレーションの数を取得
$attentionTag = Tag::withCount('item')
->orderBy('item_count', 'desc')
->get();
return view('index', compact('items', 'attentionTag'));
}
}
'item_count'は一体どこから…?
↓
リレーション結果の件数を実際にレコードを読み込むことなく知りたい場合は、withCountメソッドを使います。件数は結果のモデルの{リレーション名}_countカラムに格納されます。
(Laravel 5.7 Eloquent:リレーション参照)
便利…{リレーション名}_countカラムをテーブルに作成していなくてもよいのだ…
####できた
これで商品に登録されている回数の多い順にタグを取得できました。