mysql - 由于 orwhere 导致查询忽略条件 - Laravel5

标签 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 (true)

尽管在查询中是隐式的,但由于 orWhere 子句,它会被忽略。

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

简而言之,如何通过列名称、描述和关键字获取产品,而不忽略 productsAvailable 函数的条款?

最佳答案

而不是:

$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();

如您所见,条件被包装到额外的位置,以便在查询中添加括号

关于mysql - 由于 orwhere 导致查询忽略条件 - Laravel5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39514766/

相关文章:

mysql - 可选的 WHERE 子句根据存储过程中的参数搜索不同的字段

php - 如何从数据库中检索数据并将其显示在表格中

mysql - SQL 查询 : deleting duplicate rows from different tables with same columns

mysql - 有两个条件的 INSERT INTO 或 UPDATE

laravel - 更改航海者模型

php - laravel 5 一对一关系显示外键名称字段

javascript - Webpack - 代码分割 : split library into it's own file

MySQL 格式数字,小数位数未知

mysql - 按多列的最高平均排名排序

sql - 像 Farmville 这样的在线游戏使用什么数据库?