18
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Laravel 【多対多】 カウントと並び替え

Last updated at Posted at 2018-12-10

前提

今回は下記項目を登録する想定で書いてます。
(商品に複数のタグを登録できる多対多の関係)

  • 商品
  • タグ

やりたいこと

  • 注目タグ(商品に登録されている数の多いタグ)を作成したい
  • 注目タグを商品に登録されている数の多い順に表示させたい

最初に

  • 商品一覧と、それに紐づくタグを表示させるページを作成する
  • ひとつの商品に、複数のタグを登録できるものとする
  • 商品(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カラムをテーブルに作成していなくてもよいのだ…

####できた
これで商品に登録されている回数の多い順にタグを取得できました。

18
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?