Active Record Relacional

Bom dia, eu estou estou tendo problemas em entender como funciona o active record relacional quando é has_many.

Eu possuo 3 tabelas, Produtos, Subcategorias e ProdutosSucategorias, onde a terceira guarda o id_produto e o id_subcategoria para que cada produto possa ter muitas subcategorias. Gostaria de saber como fazer com que o CRUD salve na tabela "ProdutosSubcategorias" as Subcategorias, e como lista-las considerando as que ja estão cadastradas(update)

Thiago, se entendi bem não há nada de mais … simplesmente no crud "ProdutosSucategorias" você terá que inserir a categoria e a subcategoria a ser cadastrada …

Agora se você quiser existe como customizar o cadastro para que ele traga num comboBox todas as subcategorias e produtos, existentes nas devidas tabelas, para evitar que você tenha que digitar o id a ser inserido, é isto que você esta querendo fazer?

Abraço

exatamente, estou tentando fazer um dropDownList com $model para que ele automaticamente preencha as selecionadas(quando for update) porem fazer isto com o model ex:


$model->ProdutosSubcategorias

retorna erro ao dar load na classe, e se utilizar só $model, diz que id_subcategoria é indefinido.

Também não sei qual seria a maneira correta de salvar após, estava pensando em beforeSave()

Ok … então você tem que fazer o seguinte:

La na sua view onde tem o form substitua a linha onde tem "$form->textField()", pelo trecho abaixo:




//Estou supondo que o nome do campo referente a categoria na tabela "ProdutosSucategorias" seja 'id_subcategoria', caso não seja você deve trocar

<?php 

echo $form->DropDownList($model,'id_subcategoria',Subcategorias::getItens(),array('empty'=>'')); 

?>



e no model Subcategorias crie o seguinte método




/*

* Método que retorna um array chave/valor para todas os registros da tabela

*/

public static function getItens(){

	//Estou supondo que exista os campos id e nome_subcategoria na tabela subcategorias, caso não seja você deve trocar	

	return CHtml::listData(self::model()->findAll(), 'id', 'nome_subcategoria');


}



Thiago, só fique atento para trocar o nome dos campos, conforme mencionei nos comentários, ok?!?

Depois é só fazer o mesmo para produtos, informando o respectivo campo e criando o método no model …

Então, é mais ou menos desta forma que estava tentando(mudei para esta porque achei mais organizado), mas da erro de id_subcategoria indefinido pois id_subcategoria não faz parte do model Produtos e sim do ProdutosSubcategorias que ele está relacionado, mas acredito que não funcione a relação neste caso

Vou postar partes do código para facilitar:

Model Produtos




	public function relations()

	{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

			'pedidoProdutos' => array(self::HAS_MANY, 'PedidoProdutos', 'id_produto'),

			'produtosSubcategorias' => array(self::HAS_MANY, 'Subcategorias', 'ProdutosSubcategorias(id_produto,id_subcategoria'),

		);

	}



Desta forma eu tive que criar um model para ProdutosSubcategorias, somente para isto e realizar operações de save depois. Não sei se era realmente necessário

_Form Produtos




        <div class="row">

		<?php echo $form->labelEx($model,'id_subcategoria'); ?>

		<?php echo $form->DropDownList($model,'id_subcategoria',Subcategorias::getItens('id','subcategoria'),array('empty'=>'','multiple'=>'multiple'));?>

		<?php echo $form->error($model,'id_subcategoria'); ?>

	</div>



Erro:

A propriedade "Produtos.id_subcategoria" não está definida.

thiago,

Você criou o método getItens no model Subcategorias?

Esse trecho do DropDownList você deve inserir no _form de "ProdutosSubcategorias" …

Outra coisa, o método getItens não necessita de parametros …

caso não entenda, posta o nome dos campos das 3 tabelas que ajudo você …

abraço…

Sim criei, mas alterei para definir os items via parâmetros por isto esta assim, Então ai que esta o problema este trecho está no _form de Produtos pois as subcategorias devem ser inseridas nos produtos entende? Tipo ao adicionar um produto o usuário deve selecionar as subcategorias em que ele está relacionado… Mas não sei como realizar isto com ActiveRecord

ok, você pode passar os parametros se quiser … porém, você deve ter um CRUD de ProdutosSubcategorias, afinal é lá que relacionamos um produto a uma subcategoria, certo?

dessa forma você precisa inserir o trecho neste form, entendeu?

Hum, então eu gero os códigos para ProdutosSubcategorias também e insiro o trecho do _form em produtos?

Não intendi exatamente a parte da inserção, pois na hora de listar save e tudo mais estaria em produtos de qualquer forma. Poderia dar um exemplo?

Quanto as tabelas estão bem simples por enquanto é apenas:




Produtos   | Subcategorias   | produtos_subcategorias

id_produto | id_subcategoria | id_produto_subcategoria

produto    | subcategoria    | id_produto

           |                 | id_subcategoria



Ok, vamos la, segue estes passos:

1 - Gere o CRUD de ProdutosSubcategorias

2 - Abra a view _form de ProdutosSubcategorias, deve haver um trecho parecido com o abaixo:




<?php echo $form->textField($model,'id_subcategoria',array()); ?>



[b]

substitua por:[/b]




<?php echo $form->DropDownList($model,'id_subcategoria',Subcategorias::getItens('id_subcategoria','subcategoria'),array('empty'=>'');?>



3 - Vá no model Subcategorias e crie o seguinte método:




public static function getItens($chave, $valor){  

        return CHtml::listData(self::model()->findAll(), $chave, $valor);

}



4 - De uma olhada na página, provavelmente agora você tem um combo no item Subcategoria

5 - Faça o mesmo para produto substituindo o textField por DropDownList e criand o método getItens

Funcionou?

Funcionou, porém o padrão que gostaria é que fosse selecionada a subcategoria ao adicionar produtos e não, adicionar produto e depois adicionar subcategoria

Então, mas da forma que a modelagem das suas tabelas foi feita o melhor é esse jeito que lhei passei …

agora, se você me disser que um produto tem apenas 1 subcategoria você pode deletar a tabela ProdutosSubcategorias e inserir o campo id_subcategoria na tabela Produtos

Então na realidade é apenas uma, mas com apenas uma eu ja havia entendido como fazer, fiz desta forma para aprender como ficaria apenas pois estou aprendendo o Yii e caso decida usar preciso saber já que é bastante usada esta forma. Mas obrigado, ajudou muito.

Ahh legal então, que bom que entendeu, realmente é bem usada. Seja bem vindo ao Yii e precisando de ajuda estamos ai …

abraço