由于orwhere而忽略条件的查询 - Laravel5

时间:2016-09-15 15:19:15

标签: mysql sql laravel laravel-5 eloquent

我有一个产品搜索,可以按名称,说明和关键字进行搜索......

有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子句而忽略它。

我的疑问是如何不使用此orWhere并使我的查询搜索产品名称,描述以及关键词?

简而言之,我如何通过列名,描述和关键字获取产品,而不忽略功能产品的条款可用?

1 个答案:

答案 0 :(得分: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();

如您所见,条件被包含在其他位置,以便在查询中添加括号