Laravel 5.1 中的多个 where 条件

Multiple where conditions in Laravel 5.1

我的多个过滤器实现有问题。我有一些复选框传递给 AJAX 一些可以有多个值的参数。 在我的控制器中,我写了这个来处理这个参数:

function getCategoria(Request $request) {
    $path_info = Request::getPathInfo();
    $path = substr($path_info, 1);
    $links = explode('/', $path);
    $categorie = \App\Models\Categorie::where('primaria',1)->get();
    $categoria = \App\Models\Categorie::where('link_statico', $path)->first(); 
    $categoriaz = \App\Models\Categorie::where('link_statico', $path)->first(); 
    $id = ucfirst($links[0]);

    $prodottip = \App\Models\Prdotticategorie::where('prodotti2categorie.id_categoria', $categoriaz->id)->join('prodotti', 'prodotti.id', '=', 'prodotti2categorie.id_prodotto')->query();

    $brands = Input::get('brands');
    $genere = Input::get('genere');
    $stagione = Input::get('stagione');
    $this->data['links'] =  $links;
    $this->data['categorie'] =  $categorie;
    $this->data['categoria'] = $categoria;  
    $this->data['categoriaz'] = $categoriaz;
    $this->data['id'] = $id;
    $this->data['pages'] = 'categorie.frontend';
    if(count($brands) > 0 && count($genere) > 0 && count($stagione) > 0) 
    {
        if(count($brands) > 0)
        {
            $brands_array = [];
                if(is_array($brands) || is_object($brands)) 
                {
                    foreach ($brands as $brand) 
                    {
                        $brands_array[] = $brand;
                    }
                        $rst = $prodottip->whereIn('prodotti.id_produttore', $brands_array);
                }
        } 
        if(count($genere) > 0)  
        {
            $genere_array = [];
                if(is_array($genere) || is_object($genere)) 
                {
                    foreach ($genere as $gen) 
                    {
                        $genere_array[] = $gen;
                    }
                        $rst = $prodottip->whereIn('prodotti.genere', $genere_array);
                }
        } 
        if (count($stagione) > 0) 
        {
            $stagione_array = [];
                if(is_array($stagione) || is_object($stagione)) 
                {
                    foreach ($stagione as $stag) 
                    {
                        $stagione_array[] = $gen;
                    }
                        $rst = $prodottip->whereIn('prodotti.stagione', $stagione_array);
                }
        }
        $prodottix = $rst->paginate(18);
    } else {
        $prodottix = $prodottip->paginate(18);

    }
    $this->data['prodottix'] = $prodottix;
    if (Request::ajax()) {
        $page = 'layouts.'.CNF_THEME.'.categorie_ajax';
        $view = view($page, $this->data)->render();
        return response()->json(['html'=>$view]);

    }
    $page = 'layouts.'.CNF_THEME.'.categorie';
    return view($page, $this->data);
}

问题是 AJAX 重新加载正确但结果保持不变。只有当我有像这样的不同场景的 elseif 时,我才能让它工作:

if(count($brands) > 0 && count($genere) > 0 && count($stagione) > 0)
   //query with 3 where 
elseif(count($brands) > 0 && count($genere) == 0 && count($stagione) == 0)
  // query with 1 where

您好,我在 Laravel 中阅读了有关 DynamicScopes 的内容,但我需要更多帮助,谢谢

function getCategoria(Request $request) {
    $path_info = Request::getPathInfo();
    $path = substr($path_info, 1);
    $links = explode('/', $path);
    $categorie = \App\Models\Categorie::where('primaria',1)->get();
    $categoria = \App\Models\Categorie::where('link_statico', $path)->first(); 
    $categoriaz = \App\Models\Categorie::where('link_statico', $path)->first(); 
    $id = ucfirst($links[0]);

    $prodottip = \App\Models\Prdotticategorie::where('prodotti2categorie.id_categoria', $categoriaz->id)->join('prodotti', 'prodotti.id', '=', 'prodotti2categorie.id_prodotto')->query();

    $brands = Input::get('brands');
    $genere = Input::get('genere');
    $stagione = Input::get('stagione');
    $this->data['links'] =  $links;
    $this->data['categorie'] =  $categorie;
    $this->data['categoria'] = $categoria;  
    $this->data['categoriaz'] = $categoriaz;
    $this->data['id'] = $id;
    $this->data['pages'] = 'categorie.frontend';
    if(count($brands) > 0 && count($genere) > 0 && count($stagione) > 0) 
    {
        if(count($brands) > 0)
        {
            $brands_array = [];
                if(is_array($brands) || is_object($brands)) 
                {
                    foreach ($brands as $brand) 
                    {
                        $brands_array[] = $brand;
                    }
                        $prodottip = $prodottip->whereIn('prodotti.id_produttore', $brands_array);
                }
        } 
        if(count($genere) > 0)  
        {
            $genere_array = [];
                if(is_array($genere) || is_object($genere)) 
                {
                    foreach ($genere as $gen) 
                    {
                        $genere_array[] = $gen;
                    }
                        $prodottip = $prodottip->whereIn('prodotti.genere', $genere_array);
                }
        } 
        if (count($stagione) > 0) 
        {
            $stagione_array = [];
                if(is_array($stagione) || is_object($stagione)) 
                {
                    foreach ($stagione as $stag) 
                    {
                        $stagione_array[] = $gen;
                    }
                        $prodottip = $prodottip->whereIn('prodotti.stagione', $stagione_array);
                }
        }
    }

    $prodottix = $prodottip->paginate(18);

    $this->data['prodottix'] = $prodottix;
    if (Request::ajax()) {
        $page = 'layouts.'.CNF_THEME.'.categorie_ajax';
        $view = view($page, $this->data)->render();
        return response()->json(['html'=>$view]);

    }
    $page = 'layouts.'.CNF_THEME.'.categorie';
    return view($page, $this->data);
}
function getCategoria(Request $request)
{
    $path_info = Request::getPathInfo();
    $path = substr($path_info, 1);
    $links = explode('/', $path);
    $categorie = \App\Models\Categorie::where('primaria', 1)->get();
    $categoria = \App\Models\Categorie::where('link_statico', $path)->first();
    $categoriaz = \App\Models\Categorie::where('link_statico', $path)->first();
    $id = ucfirst($links[0]);

    $prodottip = \App\Models\Prdotticategorie::where('prodotti2categorie.id_categoria', $categoriaz->id)->join('prodotti', 'prodotti.id', '=', 'prodotti2categorie.id_prodotto')->query();

    $brands = Input::get('brands');
    $genere = Input::get('genere');
    $stagione = Input::get('stagione');
    $this->data['links'] = $links;
    $this->data['categorie'] = $categorie;
    $this->data['categoria'] = $categoria;
    $this->data['categoriaz'] = $categoriaz;
    $this->data['id'] = $id;
    $this->data['pages'] = 'categorie.frontend';
    $rst = null;
    if (count($brands) > 0) {
        $brands = is_object($brands) ? array($brands) : $brands;
        $rst = $prodottip->whereIn('prodotti.id_produttore', $brands);
    }

    if (count($brands) > 0) {
        $genere = is_object($genere) ? array($genere) : $genere;
        $rst = $prodottip->whereIn('prodotti.genere', $genere);
    }

    if (count($stagione) > 0) {
        $stagione = is_object($stagione) ? array($stagione) : $stagione;
        $rst = $prodottip->whereIn('prodotti.stagione', $stagione);
    }

    if(null !== $rst) {
        $prodottix = $rst->paginate(18);
    } else {
        $prodottix = $prodottip->paginate(18);
    }

    $this->data['prodottix'] = $prodottix;
    if (Request::ajax()) {
        $page = 'layouts.' . CNF_THEME . '.categorie_ajax';
        $view = view($page, $this->data)->render();

        return response()->json(['html' => $view]);
    }

    $page = 'layouts.' . CNF_THEME . '.categorie';
    return view($page, $this->data);
}
  • 考虑 $brands,$genere,$stagione 是数组 默认。如果它是对象然后键入转换为数组并在中使用 查询。
  • 首先删除检查计数的 if 条件 所有 3 个数组,然后尝试建立查询。
  • 创建了默认值为 null 的新变量 $rst。在满足任何条件的情况下,它将查询对象分配给 $rst.
  • 最后检查 $rst 不等于 null 并调用它的 paginate 方法。

希望这能让您明白并解决您的问题。如果没有,至少你会知道如何重构你的代码:)