Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

shariff's avatar
Level 51

How to use if condition in whereIn Clause

I want to retrieve data based on certain condition. The condition is I need check first it matches the brands names and then I need to check the regions. If region is equal to All then no need to check for regions and it is not then I need to check regions as well.

I have tried some code But it is not working. I need some help in writing a Laravel query.


public function index(Request $request)
{

        $brand_name = Auth::user()->brands()->get(['brand_name']);
        $brands = Brands::whereIn('brand_name',$brand_name)->get(['id']);
        $region = Auth::user()->regions()->get(['region_name']);


      $claim = Claim::whereIn('brand_id',$brands)
                ->where(function($query) use($region) {
                    if(!in_array('All',$region->toArray()))
                    {
                        $query->whereIn('store_region',$region);
                    }
                })->latest()->get();

      dd($claim);


}


I don't know whether we can use if condition inside query or not. I have tried like this but not working

0 likes
27 replies
Sinnbeck's avatar

You can use when

$query->when(!in_array('All',$region->toArray()), function ($q) {
    $q->whereIn('store_region',$region);
})->latest()->get();
shariff's avatar
Level 51

@sinnbeck I tried using when keyword I am getting an error


in_array() expects parameter 3 to be bool, object given", exception: "ErrorException"

Sinnbeck's avatar

Oops forgot a closing )

Answer has been updated

shariff's avatar
Level 51

@sinnbeck I don't know whether I am doing it correct or not for this code

 $claim = Claim::whereIn('brand_id',$brands)
                ->where(function($query) use($region) {
                    $query->when(!in_array('All',$region->toArray()),function($q){
                        $q->whereIn('store_region',$region);
                    });
                })->latest()->get();

I am getting error {message: "Undefined variable: region", exception: "ErrorException",…}

Sinnbeck's avatar
$claim = Claim::whereIn('brand_id',$brands)
                ->when(!in_array('All',$region->toArray()),function($q){
                        $q->whereIn('store_region',$region);
                })->latest()->get();
Sinnbeck's avatar

Could you say a bit more? How is it not working? An error? Wrong data?

Sinnbeck's avatar

Ok. And you have rows in the database that has both matches on brand_id and store_region?

You can use telescope, debugbar or clockwork to check your query.

shariff's avatar
Level 51

@sinnbeck the problem is I am getting data if regions not have All. If regions contains All I am not getting data based on only brands names it is returning empty rows.

for better understanding

if brands = 'ABC' and region='South' I should get data based on 2 condition brands and region. (this is working fine)

if brands = 'ABC' and region='All' I should get data based on only brands.

Sinnbeck's avatar

Try this and paste the outcome (while region=All)

$claim = Claim::whereIn('brand_id',$brands)
                ->when(!in_array('All',$region->toArray()),function($q){
                        $q->whereIn('store_region',$region);
                })->latest()->toSql();
dd($claim);
shariff's avatar
Level 51

@sinnbeck I got this query

"select * from `claims` where `brand_id` in (?) and `store_region` in (?) and `claims`.`deleted_at` is null order by `created_at` desc"
Sinnbeck's avatar

So the in_array returns false (true).

Post the output of

dd(in_array('All',$region->toArray(), $region->toArray());
MichalOravec's avatar

Try it like this

$claims = Claim::when(! in_array('All', $region->toArray()), function ($query) use ($brands, $region) {
    return $query->whereIn('brand_id', $brands)->whereIn('store_region', $region);
}, function ($query) use ($brands) {
    return $query->whereIn('brand_id', $brands);
})->latest()->get();
MichalOravec's avatar
$claims = Claim::when(! $region->contains('region_name', 'All')), function ($query) use ($brands, $region) {
    return $query->whereIn('brand_id', $brands)->whereIn('store_region', $region->pluck('region_name'));
}, function ($query) use ($brands) {
    return $query->whereIn('brand_id', $brands);
})->latest()->get();
1 like
Sinnbeck's avatar

Use dd() to check each thing like I just showed you.

For instance

dd($region->contains('region_name', 'All'));
Sinnbeck's avatar
Sinnbeck
Best Answer
Level 102
$claim = Claim::whereIn('brand_id',$brands)
                ->when(!in_array('All',$region->flatten()->toArray()),function($q){
                        $q->whereIn('store_region',$region);
                })->latest()->get();
1 like
shariff's avatar
Level 51

@michaloravec Hey thanks for your help the 2nd code is working and I am able to get the exact result . But I don't know how the code is working. But thank you very very much

shariff's avatar
Level 51

@sinnbeck Thanks very very much for helping. You are the best. I don't remember how many things I have learned from you.

Please or to participate in this conversation.