Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
pessoal,
imaginem a seguinte situação..
-Produtos
-Categorias
uma categoria tem e pertence a muitos produtos (hasAndBelongsToMany)
e vice-versa...
como eu posso fazer para por exemplo, listar só as categorias que possuirem produtos,
ou seja, mostrar apenas as categorias que possuem relacionamento com os produtos cadastrados?
Dessa forma lista todas
$this->Produto->Categoria->find('list');
obrigado pela resposta m@dDog,
porem não funcionou,
encontrei duas formas de fazer o "INNER JOIN" que eu preciso e as duas
não me parecem coisas muito elegantes..
a primeira seria criar um modelo para a tabela de relacionamento (isso realmente é gambi)
e outra seria como "enganar" o cake,
dar um bind do tipo has one em tempo de execução (dessa forma eu consegui)
porem também achei meio gambiii
e eu queria fazer isso com ORM, se não criaria uma view com esse inner join, criaria
um método no model e boa.
valeu
Não vejo problema em executar queries de métodos da model, quando são SQLs mais complexos, crio métodos nas models com os SQLs
$this->query("SELECT `Categoria`.`descricao`,
`Categoria`.`id`
FROM `categorias` AS `Categoria`
INNER JOIN `categorias` AS `CategoriaPai` ON (`Categoria`.`categoria_id` = `CategoriaPai`.`id`)");
Você pode até executar do controller para testar, mas eu não acho que é uma boa prática deixar no controller.
$this->Categoria->query("SELECT `Categoria`.`descricao`,
`Categoria`.`id`
FROM `categorias` AS `Categoria`
INNER JOIN `categorias` AS `CategoriaPai` ON (`Categoria`.`categoria_id` = `CategoriaPai`.`id`)");
Não lembro como, mas sei que da para executar find e findAll com INNER JOIN ao invés de LEFT JOIN que é feito por default da framework.
Qualquer dúvida popsta ai.
Falow.
encontrei uma solução mais agradável para o problema
E ai Lucas
o primeiro parâmetro é o conditions, você passa um array com as condições. Como no exemplo abaixo, a primeira condição é para trazer quando o nome for igual a 'Thomas Anderson'.
mas você pode passar quantas condições quiser no array
o segundo parâmetro são os campos, é um array simples com os campos que deseja retornar do banco de dados
o terceiro é a ordenação desejada
o quarto é a recursividade de tabelas, os joins. Cuidado, este valor pode tornar a busca lenta com muitos joins. Se for somente para a tabela da model, sem joins, o valor é -1
No teu caso, como você quer as categorias que tenham produto, acredito que tenha que usar $recursive=0
Normalmente o find é usado para trazer apenas um regitro, para trazer vários, usa-se o parâmetro 'all', como neste exemplo.
Ou usa-se a função findAll
****
Este exemplo é da api do CAKE
find('all', array( 'conditions' => array('name' => 'Thomas Anderson'), 'fields' => array('name', 'email'), 'order' => 'field3 DESC', 'recursive' => 2, 'group' => 'type'));
Um exemplo meu
se a busca não funcionar, mude o debug do cake para 2, la no arquivo config->core.php, assim você pode vizualizar as queries da framework, podendo copia-la e executa-la no phpMyAdmin para verificar o problema.
Agora para fazer o que você precisa é usar a criatividade.
Você tambem pode executar as queries manualmente, tipo "SELECT * FROM ..."
Espero ter ajudado,
na api do cake tem muito mais, é só procurar por "find" ou "findAll",
qualquer coisa posta ai.