Filtrar com relacionamento category.name
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 ?
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? :-)
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);
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.
Precisa estar logado para conseguir responder a este ticket!
Clique Aqui Para Entrar!