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?
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()
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
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
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?
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.