Laravel将变量传递给wherehas查询

时间:2016-08-12 09:42:50

标签: php laravel laravel-query-builder

我想在laravel中将变量传递给wherehas,但是得到一个未定义变量的错误, 在方法中,如果有自然然后去哪里有自然等于$ catname ... 在线号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

2 个答案:

答案 0 :(得分:6)

要将变量传递给闭包,您必须使用use()函数

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

        });

答案 1 :(得分:0)

如果要在变量中提供字符串,请使用此代码

$catname = 'abc';

或声明abc常量

const abc = 123;