3
2

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 1 year has passed since last update.

【Laravel】中間テーブルのカラムでデータを取得する

Posted at

概要

users,groups,user_group(中間テーブル)があり、中間テーブルのカラムで条件を絞ってデータを取得したいみたいなことはよくあると思います。
今回は「グループに所属しているアクティブなユーザー」を取得するという条件で見ていきたいと思います。

usersテーブル
id
name
created_at
updated_at
groupsテーブル
id
name
created_at
updated_at
user_groupテーブル
user_id
group_id
is_active
created_at
updated_at

結論

withPivotをmodelに追加

Group.php
class Group extends Model
{
    /**
     * グループに属するユーザー
     */
    public function users()
    {
        return $this->belongsToMany(User::class)
             ->withPivot('is_active');// 追加する
    }
}

User.php
class User extends Model
{
    /**
     * ユーザーが所属するグループ
     */
    public function groups()
    {
        return $this->belongsToMany(Group::class)
            ->withPivot('is_active');// 今回は使用しないですが、追加しておきます
    }
}

どうやって条件を絞るのか

条件をフィルタリングする際はwherePivotというもの使います。

GroupController.php
$group = Group::find(1);

//グループに所属しているアクティブなユーザーを取得
$activeUsers = $group->users()->wherePivot('is_active', true)->get();

ちなみにwherePivot以外にも取得条件を指定できるのが用意されているので、かなり便利です。

その他のフィルタリング
wherePivotIn
wherePivotNotIn
wherePivotBetween
wherePivotNotBetween
wherePivotNull
wherePivotNotNull

参考

3
2
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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?