Laravel belongsToMany select all specified ids

73 Views Asked by At

Relation

    public function groups()
    {
            return $this->belongsToMany('App\Models\ItemGroup','item_to_group','item_id','item_group_id');
    }

** How to select all Items that have item_group_id 0 and 9 BOTH?**

    $zero_and_nine_count = \App\Models\Item::with(['groups' => function ($query) {
        $where[] = ['item_group_id', , 0];
        $where[] = ['item_group_id', '=', 9];
        $query->where($where);
    }])->count();

Counts all Items

Working SQL:

SELECT item_id FROM `item_to_group` WHERE `item_group_id` = 9 AND item_id IN (SELECT item_id FROM `item_to_group` WHERE `item_group_id` = 0)
2

There are 2 best solutions below

1
Wahyu Kristianto On BEST ANSWER

Reference :

SELECT item_id 
FROM `item_to_group` 
WHERE 
    `item_group_id` = 9 AND 
    item_id IN (
        SELECT item_id 
        FROM `item_to_group` 
        WHERE `item_group_id` = 0
    )

You can query like this :

$items = \App\Models\Item::whereHas('groups', function ($query) {
        $query->where('item_group_id', 9)
            ->whereIn('item_id', function ($subquery) {
                $subquery->select('item_id')
                    ->from('item_to_group')
                    ->where('item_group_id', 0);
            });
    })->get();
2
E-g On

Sounds like you're looking for whereIn?

$model->groups()->whereIn('item_group_id', [0, 9])->get();