2016-09-15 1 views
0

У меня есть поиск продукта, который делает поиск по названию, описанию, а также ключевые слова, ...запросов пренебрегая условия из-за orwhere - Laravel5

Там находятся 3 колонки, которые содержат эти элементы следующим образом: Название, описание и ключевые слова

Моя проблема в том, что когда я выполняю поиск запросов к продукту, возвращает мне список с несколькими продуктами, но некоторые из них не должны перечисляться для несоблюдения всех требований .... следует за запросом:

Мои действия:

public function search($data) 
{ 
    $products = $this->queryProductsAvailable() 
         ->where('produtos.nome', 'like', '%'.$data.'%') 
         ->orWhere('produtos.descricao', 'like', '%'.$data.'%') 
         ->orWhere('produtos.palavras_chave', 'like', '%'.$data.'%') 
         ->limit($this->_limitProducts) 
         ->orderBy('fornecedores.plano_id', 'DESC') 
         ->get(); 

    $this->savePrint($products); 

    // $categories = $this->setCategories(); 

    return view('Catalogo.search', [ 
       'products' => $products, 
       'searchTerm' => $data 
      ] 
     ); 
} 


private function queryProductsAvailable() 
{ 
    return Products::join('fornecedores', 'fornecedores.id', '=' ,'produtos.fornecedor_id') 
         ->where('fornecedores.ativo', 1) 
         ->where('produtos.moderacao', "P") 
         ->where('produtos.ativo' , true) 
         ->where('produtos.preco_min', '>', 0) 
         ->select('produtos.*'); 
         // ->limit($this->_limitProducts); 
} 

При выполнении запроса возвращаются продукты, которые не в стандарте «productsAvailable», который должен быть fornecedor.ativo = 1 и produtos.ativo = 1 (истина)

Несмотря на то что подразумевается в запросе , он игнорирует из-за предложений orWhere.

Мое сомнение заключается в том, как не использовать это илиWhere и сделать мой запрос искать название, описание и ключевые слова?

Вкратце, как мне получить продукты по имени, описанию и ключевым словам столбцов, не игнорируя условия функциональных продуктов? Доступно?

ответ

2

Вместо:

$products = $this->queryProductsAvailable() 
        ->where('produtos.nome', 'like', '%'.$data.'%') 
        ->orWhere('produtos.descricao', 'like', '%'.$data.'%') 
        ->orWhere('produtos.palavras_chave', 'like', '%'.$data.'%') 
        ->limit($this->_limitProducts) 
        ->orderBy('fornecedores.plano_id', 'DESC') 
        ->get(); 

вы должны использовать:

$products = $this->queryProductsAvailable() 
    ->where(function($q) use ($data) { 
     $q->where('produtos.nome', 'like', '%'.$data.'%') 
      ->orWhere('produtos.descricao', 'like', '%'.$data.'%') 
      ->orWhere('produtos.palavras_chave', 'like', '%'.$data.'%') 
    })->limit($this->_limitProducts) 
    ->orderBy('fornecedores.plano_id', 'DESC') 
    ->get(); 

Как вы видите, условия были завернуты в дополнительные где добавить скобки в запросе

+0

Спасибо! Я попробую еще раз пообедать – Dayglor

+0

Это сработало! Спасибо! Любая статья, которую я могу прочитать об этой функции в том месте где? Я хотел бы узнать больше об этом. – Dayglor

+0

@ Dayglor Лучшее место для начала - документация Laravel. В тех случаях, когда группировка условий конкретно адресована [здесь] (https://laravel.com/docs/5.3/queries#parameter-grouping). – patricus

Смежные вопросы