Chave composta e atributo em tabela associativa

90 views
Skip to first unread message

Fênix

unread,
Jan 22, 2008, 7:59:13 AM1/22/08
to Cake PHP Português
Olá pessoa, sou um novo membro do grupo,

estou precisando de um ajuda.

no modelo de banco de dados que estou trabalhando há um associação
muitos pra muitos que gera um atributo na tabela associativa.


seguindo o padrão de nomenclatura do cake toda chave primária deve ser
ID, porém o que acontece na tabela associativa é que há um chave
composta.

as tabelas são as seguintes.

::: ALUNOS E DISCIPLINAS

na tabela associativa ALUNOS_DISCIPLINAS, vou precisar cadastrar as
notas do aluno. este atributo deveria se guardado na tabela
associativa.

o que eu queria saber é se há como definir no model que há uma chave
composta e trabalhar em cima dessa chave composta. ao invés de ter que
criar uma ID na tabela ALUNOS_DISCIPLINAS e ter que cadastrar um a um.

Juan Basso

unread,
Jan 23, 2008, 10:36:36 AM1/23/08
to Cake PHP Português
Cara,

Esse é um dos principais "medos" do Cake. Isso são chamadas as
relações HABTM (hasAndBelongToMany). Veja no groups internacional
(mesmo link deste, mas sem o "-pt") ou no site do Daniel (http://
cakebaker.42dh.com). Acho que são os melhores lugares além do IRC para
ver sobre isso.

Não entendi muito bem a sua dúvida, mas você quer informar o id da
outra tabela? Você já tentou usar o atributo "foreign_key" na relação?

Quando você gera via cake bake ele normalmente já faz tudo isso pra
você.


Juan Basso

Augusto Ferreira

unread,
Jan 23, 2008, 11:39:46 AM1/23/08
to cake-...@googlegroups.com
Passei pelo mesmo problema, para pegar os dados da tabela associativa coloquei na relação algo do tipo, por exemplo no model Disciplina

var $hasAndBelongsToMany = array(
            'Alunos' =>
                array('className' => 'Servico',
                        'joinTable' => '',
                        'foreignKey' => '',
                        'associationForeignKey' => '',
                        'conditions' => '',
                        'fields' => 'Aluno.*, alunos_disciplinas.nota',
                        'order' => '',
                        'limit' => '',
                        'offset' => '',
                        'unique' => '',
                        'finderQuery' => '',
                        'deleteQuery' => '',
                        'insertQuery' => ''
                ),
    );

Com isso você consegue obter os dados, agora para gravar não cheguei a uma solução boa...

Em 22/01/08, Fênix <paulo....@gmail.com> escreveu:

DJ Spark

unread,
Jan 23, 2008, 11:53:54 AM1/23/08
to cake-...@googlegroups.com
oi Juan,

Na verdade, o que o Fenix quer, é usar uma chave não única: aquela
linha do BD seria unica não porque tem um ID numérico e único, mas,
sim, porque tem DOIS atributos que, em conjunto, são únicos. Exemplo:
- nome
- email

jose / no...@bla.com
jose / josec...@bla.com
joao / jo...@bla.com
joao / no...@bla.com

Você não precisa definir uma chave unica para ele, voce define o INDEX
UNIQUE para nome e email, e pronto.

Agora, ao Fenix: a resposta para essa pergunta no grupo oficial do
cakephp é sempre: "sorry dude, use primary keys". (seguido de algum
sermão sobre isso ser má-prática, boa-prática, uso de UUID, origem do
SQL, etc etc :)

Então, a solução para usar o cake nesse caso é definir um índice
primário para sua tabela, mesmo que use também a chave
composta...sorry :)

Spark


2008/1/23 Juan Basso <jrb...@gmail.com>:

--
[livesets] http://djspark.com.br/
[web] http://sydi.net
[filmes] http://melhoresfilmes.com.br

Juan Basso

unread,
Jan 23, 2008, 4:04:55 PM1/23/08
to Cake PHP Português
Hmmmmm, entendi. Eu uso um ID na tabela do mesmo jeito.

Se for necessário manter unicos os campos compostos, eu crio uma index
no DB, mas não primário. (CREATE INDEX...)


Juan Basso

On 23 jan, 13:53, "DJ Spark" <djsp...@gmail.com> wrote:
>  oi Juan,
>
>  Na verdade, o que o Fenix quer, é usar uma chave não única: aquela
> linha do BD seria unica não porque tem um ID numérico e único, mas,
> sim, porque tem DOIS atributos que, em conjunto, são únicos. Exemplo:
> - nome
> - email
>
> jose / no...@bla.com
> jose / josecar...@bla.com
> joao / j...@bla.com
> joao / no...@bla.com
>
> Você não precisa definir uma chave unica para ele, voce define o INDEX
> UNIQUE para nome e email, e pronto.
>
>  Agora, ao Fenix: a resposta para essa pergunta no grupo oficial do
> cakephp é sempre: "sorry dude, use primary keys". (seguido de algum
> sermão sobre isso ser má-prática, boa-prática, uso de UUID, origem do
> SQL, etc etc :)
>
>  Então, a solução para usar o cake nesse caso é definir um índice
> primário para sua tabela, mesmo que use também a chave
> composta...sorry :)
>
>  Spark
>
> 2008/1/23 Juan Basso <jrba...@gmail.com>:
> [filmes]http://melhoresfilmes.com.br- Ocultar texto entre aspas -
>
> - Mostrar texto entre aspas -

Fênix

unread,
Jan 25, 2008, 6:29:34 AM1/25/08
to Cake PHP Português
Eu já havia percebido, embora não fosse a solução que eu queria, eu
criei mesmo uma id pra tabela associativa como primary key.

sobre a primeira resposta do Juan Basso: o queria na verdade é saber
se há como informar ao cake que não há uma coluna id se comportando
como primary key e sim dois atributos que compõem uma chave primária
composta, que no caso seria aluno_id e disciplina_id.
> > [filmes]http://melhoresfilmes.com.br-Ocultar texto entre aspas -
Reply all
Reply to author
Forward
0 new messages