Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Lucas Renan

[Resolvido] Como listar apenas registros relacionados?

Recommended Posts

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');

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

$conditions = array("`Categoria.id` = '$id'");

$categoria = $this->Categoria->find($conditions, $fields = NULL, $order = NULL, $recursive = -1 );

 

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.