我有一个产品搜索,可以按名称,说明和关键字进行搜索......
有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并使我的查询搜索产品名称,描述以及关键词?
简而言之,我如何通过列名,描述和关键字获取产品,而不忽略功能产品的条款可用?
答案 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();
如您所见,条件被包含在其他位置,以便在查询中添加括号