ViicT 0 Denunciar post Postado Março 1, 2011 Bom gente, estou desenvolvendo uma aplicação que controla um sistema de tarifação na qual eu tenho um Produto (Product) que possui vários Serviços (Service) e cada serviço possui vários valores Base (Base). Gostaria de por todas as tabelas juntas e não fugir do uso do saveAll que me garante uma inserção atômica (que é muito util nesse caso). O problema é que como eu posso em uma mesma tela ter vários serviços e várias bases como eu poderia fazer para que eu garantisse o uso do saveAll? Abaixo eu ponho a solução que encontrei, mas, sem usar o saveAll. E gostaria muito de me ater a coisas boas que o cake tem para me oferecer. Posso remodelar o banco e etc. Meu banco de dados está criado da seguinte forma: Meu Product model: <?php class Product extends AppModel { var $name = 'Product'; var $displayField = 'name'; var $recursive = 2; //tentativa var $hasMany = array( 'Service' => array( 'className' => 'Service', 'foreignKey' => 'product_id', 'dependent' => true ) ); } ?> Meu Service model: <?php class Service extends AppModel { var $name = 'Service'; var $displayField = 'name'; var $recursive = 2; var $belongsTo = array( 'Product' => array( 'className' => 'Product', 'foreignKey' => 'product_id' ) ); var $hasMany = array( 'Basis' => array( //Pode até parecer estranho mas o cake que deu esse nome o.õ e eu preferi manter 'className' => 'Basis', 'foreignKey' => 'service_id', 'dependent' => true, ) ); } ?> Meus inputs: <thead> <tr> <th>TIPO/BASE</th> <th>CÓDIGO</th> <th><?php echo $this->Form->input('Base.0.0.pax_begin', array('label' => false)); ?></th> <th><?php echo $this->Form->input('Base.0.1.pax_begin', array('label' => false)); ?></th> <th><?php echo $this->Form->input('Base.0.2.pax_begin', array('label' => false)); ?></th> <th><?php echo $this->Form->input('Base.0.3.pax_begin', array('label' => false)); ?></th> </tr> </thead> <tbody> <tr> <td><?php echo $this->Form->input('Service.0.name', array('label' => false)); ?></td> <td><?php echo $this->Form->input('Service.0.code', array('label' => false)); ?></td> <td><?php echo $this->Form->input('Base.0.0.value', array('label' => false)); ?></td> <td><?php echo $this->Form->input('Base.0.1.value', array('label' => false)); ?></td> <td><?php echo $this->Form->input('Base.0.2.value', array('label' => false)); ?></td> <td><?php echo $this->Form->input('Base.0.3.value', array('label' => false)); ?></td> </tr> <tr> <td><?php echo $this->Form->input('Service.1.name', array('label' => false)); ?></td> <td><?php echo $this->Form->input('Service.1.code', array('label' => false)); ?></td> <td><?php echo $this->Form->input('Base.1.0.value', array('label' => false)); ?></td> <td><?php echo $this->Form->input('Base.1.1.value', array('label' => false)); ?></td> <td><?php echo $this->Form->input('Base.1.2.value', array('label' => false)); ?></td> <td><?php echo $this->Form->input('Base.1.3.value', array('label' => false)); ?></td> </tr> </tbody> Minha função add() do controller Product: function add() { if (!empty($this->data)) { $this->Product->create(); if ($this->Product->save($this->data, array('atomic', true))) { $product_id = $this->Product->id; $service_id = array(); foreach($this->data['Service'] as $i => $service) { $this->Service->create(); $this->data['Service'][$i]['product_id'] = $product_id; $this->Service->save($this->data['Service'][$i]); $service_id[] = $this->Service->id; } foreach($this->data['Base'] as $i => $base) { foreach($base as $o => $B) { $this->data['Base'][$i][$o]['service_id'] = $service_id[$i]; $this->Base->create(); $this->Base->save($this->data['Base'][$i][$o]); } } $this->Session->setFlash(__('The product has been saved', true)); $this->redirect(array('action' => 'index')); } else { $this->Session->setFlash(__('The product could not be saved. Please, try again.', true)); } } } Compartilhar este post Link para o post Compartilhar em outros sites
vieira.rrafael 2 Denunciar post Postado Março 5, 2011 <?php e($this->Form->create('Product')); $product = array( 'legend'=>__('Produto') 'Produto.name'=>array( 'label' => 'Nome do produto', 'maxlength' => 50 ), #outros atributos de Product ); $service = array( 'legend'=>__('Serviço') 'Service.name'=>array( 'label' => 'Nome do serviço', 'maxlength' => 50 ), #outros atributos de Service #exceto a chave estrangeira ); e($this->Form->inputs($product)); e($this->Form->inputs($service)); e($this->Form->end(__('Salvar', true))); ?> Quando esses valores forem submetidos, serão passados assim: array( [Product] => array ( [name] => o nome do produto, # outros valores ), [service] => array ( [nome] => o nome do serviço, #outros valores ) ); E o saveAll deve funcionar Compartilhar este post Link para o post Compartilhar em outros sites
MarcioVinicius 0 Denunciar post Postado Março 14, 2011 Salve Galera, Eu sei que esse tópico é bastante antigo, porém o problema é bastante atual. Estou na mesma situação. Alguém sabe como fazer o cake validar e inserir vários associações hasMany? No meu caso os modelos são: Pedido >> EnderecoDoPedido >> TelefoneDoEnderecoDoPedido E gostaria de utilizar o saveAll ou algo que fizesse todas as validações em bloco, como o autor deste tópico. Compartilhar este post Link para o post Compartilhar em outros sites
elias_farah 0 Denunciar post Postado Abril 15, 2011 Salve Galera, Eu sei que esse tópico é bastante antigo, porém o problema é bastante atual. Estou na mesma situação. Alguém sabe como fazer o cake validar e inserir vários associações hasMany? No meu caso os modelos são: Pedido >> EnderecoDoPedido >> TelefoneDoEnderecoDoPedido E gostaria de utilizar o saveAll ou algo que fizesse todas as validações em bloco, como o autor deste tópico. Você deve fazer as associações e usar o $this->Model->saveAll($data) onde $data deve estar no Padrão Array ( [Article] => Array ( [title] => My first article ) [Comment] => Array ( [0] => Array ( [comment] => Comment 1 [user_id] => 1 ) [1] => Array ( [comment] => Comment 2 [user_id] => 2 ) ) ) Compartilhar este post Link para o post Compartilhar em outros sites