Manish Arora Manish Arora - 3 months ago 12
PHP Question

Laravel passing variable to wherehas query

I want to pass variable to wherehas query in laravel.. but getting an error of undefined variable,
In method, if has nature then go where has natures equal to $catname...
in line no. 4

public function Products($catname,Request $request) //Product Category Pages
{
$natures = Nature::where('nature_slug', '=', $catname)
->first();
if($natures)
{ //Where Clause Based On Products Nature
//dd($catname);
$maxproductscost = Product::selectRaw('MAX(ABS(price)) AS HighestPrice')
->whereHas('natures', function($q) use ($catname)
{
$q->where('nature_slug', '=', $catname);
})
->first();
$maxproductscost = ceiling($maxproductscost->HighestPrice, 100);
/*End - GEt Maximum cost of product*/
if($request->range){
$range = $request->range;
$pieces = explode(" ", $range);
$rangestart = $pieces['1'];
$rangeend = $pieces['4'];
}
$firstslidervalue = $request->range ? $rangestart : 0;
$secondslidervalue = $request->range ? $rangeend : $maxproductscost;
$sorting = $request->sorting ? $request->sorting : '';

$products = Product::whereHas('natures', function($q)
{
$q->where('nature_slug', '=', $catname);

});

}
else
{
//Where Clause Based On Products Nature is General
/*GEt Maximum cost of product*/
$maxproductscost = Product::selectRaw('MAX(ABS(price)) AS HighestPrice')
->where('ptype', '=', $catname)
->whereHas('natures', function($q)
{
$q->where('nature_slug', '=', 'general');
})
->first();
$maxproductscost = ceiling($maxproductscost->HighestPrice, 100);
/*End - GEt Maximum cost of product*/
if($request->range){
$range = $request->range;
$pieces = explode(" ", $range);
$rangestart = $pieces['1'];
$rangeend = $pieces['4'];
}
$firstslidervalue = $request->range ? $rangestart : 0;
$secondslidervalue = $request->range ? $rangeend : $maxproductscost;
$sorting = $request->sorting ? $request->sorting : '';

$products = Product::where('ptype', '=', $catname)
->whereHas('natures', function($q)
{
$q->where('nature_slug', '=', 'general');

});
}

if($request->range){
$products->whereBetween('price', [$rangestart, $rangeend]);
}
if($sorting)
{
if($sorting == 'low')
{
$products->orderByRaw('(ABS(stock) > 0) desc, (case when ABS(stock) > 0 then ABS(price) end) asc, (case when ABS(stock) = 0 then ABS(price) end) asc ');
} else
{
$products->orderByRaw('(ABS(stock) > 0) desc, (case when ABS(stock) > 0 then ABS(price) end) DESC, (case when ABS(stock) = 0 then ABS(price) end) DESC ');
}
}
else
{
$products->orderByRaw('(ABS(stock) > 0) desc, (case when ABS(stock) > 0 then id end) DESC, (case when ABS(stock) = 0 then id end) DESC ');
}


$products = $products->paginate(12);

$user = Auth::user();
return view('products',compact('user','catname','products','maxproductscost','firstslidervalue','secondslidervalue','sorting'));
}


enter image description here

Answer

To pass a variable to closure you have to use the use() function

$products = Product::whereHas('natures', function($q) use($catname)
        {
            $q->where('nature_slug', '=', $catname);

        });