cakePHP - Relacionamento HABTM

22 views
Skip to first unread message

Wagner Franze Junior

unread,
Nov 16, 2009, 7:04:13 PM11/16/09
to Cake PHP Português
Boa noite...

Estou trabalhando com HABTM para salvar dados em relacionamento muitos
para muitos, o único problema que estou encontrando é que, ao salvar
os dados o sistema tenta salvar também os os valores que eu não
selecionei em alguns checkbox.

A minha estrutura é a seguinte, possuo uma tabela Livros, Categorias e
Categorias_Livros.

A Model para a tabela Livros se encontra da seguinte forma:
<?php


class Livro extends AppModel{

var $name = 'Livro';
var $primaryKey = 'livro_id';
var $hasAndBelongsToMany = array( 'Categoria' => array
( 'className' => 'Categoria',
'joinTable' => 'categorias_livros',
'foreignKey' => 'livro_id',
'associationForeignKey' => 'categoria_id',
'unique' => true,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'finderQuery' => '',
'deleteQuery' => '',
'insertQuery' => '' ) );

}
?>


O arquivo de controller:

<?php

class LivrosController extends AppController{

var $name = 'Livros';
var $helpers = array( 'Html' , 'Form' , 'Javascript' , 'Ajax' );
var $uses = array( 'Categoria', 'Livro' );

function index(){
$this->set('Livros', $this->Livro->find('all', array
( 'Livro.livro_id' , 'Livro.nome' )));
}

function add(){

$this->set('Categorias', $this->Categoria->find('all', array
( 'Categoria.categoria_id' , 'Categoria.nome' )));

if( $this->Livro->saveAll( $this->data )){
print_r( $this->data );
}
}

}

?>


e o add.ctp :

<?php

print $form->create('Livro');

print $form->input('Livro.nome', array( 'type' => 'text' , 'label'
=> 'Nome' ));

print '<ul>';
$cont = 0;
foreach( $Categorias as $c ):
print $form->input( 'Categoria.' . $cont . '.categoria_id' , array
( 'type' => 'checkbox', 'label' => false , 'value' => $c['Categoria']
['categoria_id'], 'before' => '<li>', 'after' => $c['Categoria']
['nome'] . '</li>' ));
$cont++;
endforeach;
print '</ul>';

print $form->end('Gravar');

?>


No arquivo add.ctp eu tenho um campo text para que possa ser informado
o nome do livro e uma lista de checkbox com as categorias para as
quais esse livro pode ser associado. A geração dos checkboxs é
dinâmica porque pode ser cadastradas novas categorias ou excluídas...


O único problema é esse mesmo. Ele insere todos os registros que eu
selecionei e tenta inserir os que eu não selecionei passando para o id
de categoria o valor 0. Queria saber se tem como eu dizer para a
controller não gerar esses inserts para os checks que eu não
selecionei?

Warning (512): SQL Error: 1452: Cannot add or update a child row: a
foreign key constraint fails (`cakestudo`.`categorias_livros`,
CONSTRAINT `fk_categorias_llivros_categorias1` FOREIGN KEY
(`categoria_id`) REFERENCES `categorias` (`categoria_id`) ON DELETE NO
ACTION ON UPDATE NO ACTION) [CORE\cake\libs\model\datasources
\dbo_source.php, line 525]


Query: INSERT INTO `categorias_livros` (`categoria_id`, `livro_id`)
VALUES (0, 8)

Edinei L. Cipriani

unread,
Nov 19, 2009, 7:02:13 AM11/19/09
to cake-...@googlegroups.com
echo $form->input( 'Categoria.' . $cont . '.livro_id' , array....

Use echo, ele é mais rápido.

abrs.

2009/11/16 Wagner Franze Junior <franz...@gmail.com>



--
Edinei L. Cipriani
Blog: http://phpedinei.wordpress.com
Twitter: http://www.twitter.com/phpedinei

Desenvolvedor Colégio Trilingue Inovação
Site: http://www.colegioinovacao.com.br
Cursando Sistemas de Informação  - Unoesc Chapecó 1 Período
Integrante do grupo Fool N Lost de algoritimos computacionais
Fone 49 84149086
Reply all
Reply to author
Forward
0 new messages