Wagner Franze Junior
unread,Nov 16, 2009, 7:04:13 PM11/16/09Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
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)