Как обрабатывать нулевое значение внутри whereIn?

У меня есть следующий запрос, который нужно выполнить, где $category_id & $industry_id пришел через запрос ajax в виде массива. поэтому иногда $category_id & $industry_id может быть нулевым значением. Итак, как избежать этой строки оператора, когда массив будет нулевым?

$products = DB::table('users')
               ->join('products','products.auth_id','users.id')
               ->Join('reviews','products.id','reviews.product_id')
               ->select('products.*','users.avatar',DB::raw('(sum(rating)/count(user_id)) as rating'))             
               ->orwhereIn('products.category_id', [$request->get('category_id')])   
               ->orwhereIn('products.industry_id',[$request->get('industry_id')])   
               ->where('products.status','=','1')           
               ->groupBy('reviews.product_id')   
               ->latest()              
               ->get();

person User57    schedule 04.10.2017    source источник
comment
COALESCE() твой друг   -  person Saad Suri    schedule 04.10.2017
comment
Вы можете использовать оператор if, когда значение null у вас есть пропустить эту строку и вернуть данные   -  person Shashikant Chauhan    schedule 04.10.2017
comment
Возьмите две переменные с $category_id=array_column($request->get('category_id')); и $industry_id=array_column($request->get('industry_id'));, сделайте запрос ->when с условием where! Он выполняется, когда категория и отрасль востребованы!   -  person Hiren Gohel    schedule 04.10.2017


Ответы (2)


Попробуйте этот запрос, это поможет.

$query = DB::table('users')
   ->join('products','products.auth_id','users.id')
   ->Join('reviews','products.id','reviews.product_id')
   ->select('products.*','users.avatar',DB::raw('(sum(rating)/count(user_id)) as rating'))             
   ->where('products.status','=','1')           
   ->groupBy('reviews.product_id')   
   ->latest();

if ($request->has('category_id')) {
    $query->orWhereIn('products.category_id', $request->get('category_id'));
}

if ($request->has('industry_id')) {
    $query->orWhereIn(''products.industry_id', $request->get('industry_id'));
}
$products = $query->get();
person Dharmesh Rakholia    schedule 04.10.2017

Самое простое решение

    $query = DB::table('users')
       ->join('products','products.auth_id','users.id')
       ->Join('reviews','products.id','reviews.product_id')
       ->select('products.*','users.avatar',DB::raw('(sum(rating)/count(user_id)) as rating'))             
       ->where('products.status','=','1')           
       ->groupBy('reviews.product_id')   
       ->latest();

    if ($categoryId = $request->get('category_id')) {
        $query->orwhere('products.category_id', $categoryId);
    }

    if ($industryId = $request->get('industry_id')) {
        $query->orwhere('products.category_id', $industryId);
    }

    $products = $query->get();

Кстати, изменил orWhereIn на orWhere, так как в любом случае это одно значение.

person ailok    schedule 04.10.2017
comment
когда я попробовал ваше решение, я получил следующую ошибку strtolower() expects parameter 1 to be string, array given - person User57; 05.10.2017
comment
И это не одно значение, это массив, который я отправляю, где может быть $category_id или $industry_id или оба - person User57; 05.10.2017
comment
Извините, но это действительно похоже на одно значение - вы делаете из него массив, заключая его в квадратные скобки: [$request->get('category_id')]. В любом случае - общий подход должен подойти. - person ailok; 05.10.2017