Ir para conteúdo

POWERED BY:

Arquivado

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

ViicT

saveAll com multiplas tabelas hasMany

Recommended Posts

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:

 

db.png

 

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
<?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

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

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

×

Informação importante

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