[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)
Mateus Eustáquio Vieira de Carvalho
Criador Mateus Eustáquio Vieira de Carvalho 08/08/2018

Faala Carlos ! Seguinte no meu caso eu listei o nome da categoria na tabela de produtos, como eu faria para filtrar pelo nome da categoria na api, adicionei no model de products no metodo getResults a seguinte expressão:  $query->orWhere('category.name', 'LIKE', "%{$filter}%"); mas retorna erro. Oque eu deveria fazer ?

Manager Carlos Ferreira 08/08/2018

Olá, Mateus!
Como vai amigo?

Só pra ver se eu entendi bem, no caso você inseriu além do id da categoria, o nome da categoria na tabela products?
Se for esse o caso não precisa, porque ao inserir ID da categoria na tabela products já relaciona os produtos com a categoria. E fazendo dessa forma está criando registros duplicados no banco (em duas tabelas diferentes).

Se jungar apenas o ID pode filtrar dessa forma:
#model Product
$produts = $this->join('categories', 'products.category_id', '=', 'categories.id')
    ->where('categories.name', 'LIKE', "%{$filter}%")
    ->where('products.name', 'LIKE', "%{$filter}%")
    ->get();

Qualquer dúvida amigo, me retorna. Tá bom? :-)

Carlos Ferreira
Criador Mateus Eustáquio Vieira de Carvalho 08/08/2018

Na verdade minha coluna produtcts esta apenas o id mesmo da category, porem da o erro:

"message": "SQLSTATE[42S22]: Column not found: 1054 Unknown column 'category.name' in 'where clause' (SQL: select count(*) as aggregate from `products` where (`name` LIKE %111111% or `description` LIKE %111111% or `category`.`name` LIKE %111111%))",

minha query:

 

$this->with('category')->where(function ($query) use ($data) {
if (isset($data['filter'])) {
$filter = $data['filter'];
$query->where('name', 'LIKE', "%{$filter}%");
$query->orWhere('description', 'LIKE', "%{$filter}%");
$query->orWhere('category.name', 'LIKE', "%{$filter}%");
}

if (isset($data['name'])) {
$name = $data['name'];
$query->where('name', 'LIKE', "%{$name}%");
}

if (isset($data['description'])) {
$description = $data['description'];
$query->where('description', 'LIKE', "%{$description}%");
}
})->orderBy('id', 'DESC')->paginate($total);

Mateus Eustáquio Vieira de Carvalho
Manager Carlos Ferreira 08/08/2018

Olá, Mateus!

No seu caso você tentou filtrar pela tabela category e ela não existe, provavelmente você tem uma tabela chamada categories e não category.

Você pode fazer assim:
$produts = $this->join('categories', 'products.category_id', '=', 'categories.id')
                    ->where(function ($query) use ($data) {
                        if (isset($data['filter'])) {
                            $filter = $data['filter'];
                            $query->where('products.name', 'LIKE', "%{$filter}%");
                            $query->orWhere('products.description', 'LIKE', "%{$filter}%");
                            $query->orWhere('categories.name', 'LIKE', "%{$filter}%");
                        }

                        if (isset($data['name'])) {
                            $name = $data['name'];
                            $query->where('products.name', 'LIKE', "%{$name}%");
                        }

                        if (isset($data['description'])) {
                            $description = $data['description'];
                            $query->where('products.description', 'LIKE', "%{$description}%");
                        }
                    })
                    ->orderBy('id', 'DESC')
                    ->paginate($total);

Dica: troca o paginate() por toSQL() e debuga a variáveis $products para analisar a query final.

Carlos Ferreira
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!