概要
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 |
参考