2009-03-25 6 views
3

Comment CakePHP traite-t-il les tables qui n'ont pas de colonne id?Comment CakePHP gère-t-il les tables HABTM avec/sans champ 'id'?

HABTM est un « a et appartient à plusieurs » table, ce qui signifie une relation plusieurs à plusieurs bases de données

Je suis en train de sauver des données relationnelles, mais gâteau veut « SELECT LAST_INSERT_ID() » Cependant, la table à laquelle elle tente d'enregistrer n'a pas la colonne id, donc l'id est pour une table différente. En particulier, j'ai des tables pour "Jeux" et "Joueurs", et une table de relations appelée "game_players". game_players a les champs game_id et player_id, et c'est sur cette table que je ne peux pas enregistrer les données de relation.

Pour clarifier: c'est la table game_player qui cause le problème. Cette table n'a pas, et ne devrait pas avoir, un champ d'identification. Il ne stocke que les relations entre le joueur et le jeu, et la clé primaire est (game_id, player_id)

Comment CakePHP gère-t-il cette situation/relation?

+0

Je ne sais pas comment CakePHP le gère, mais pourquoi n'avez-vous pas d'ID? –

+0

La table n'en a pas besoin. Le PK est (game_id, player_id). C'est strictement une table de relation. – davethegr8

Répondre

5

Est-ce que Game HABTM Player, ou vice versa? Si c'est le cas, vous ne devriez pas avoir de champ ID sur votre table de jeux games_players. Et vous devriez être en mesure d'enregistrer des données à en appelant d'économiser sur jeu avec un tableau de données comme

$this->Game->save(array(
    'Player'=>array(
    'Player'=>array(
     1,4,5,9 // Player IDs 
    ) 
) 
)); 

Dans ce cas, gâteau ne sera pas essayer d'obtenir le dernier id d'insertion.

Si toutefois, Game ne possède pas HABTM Player et que vous appelez save sur votre GamePlayer modèle directement, il doit avoir un champ ID pour s'adapter aux conventions Cake.

0

Pour votre temps et vos efforts, serait-il préférable d'aller de l'avant et d'ajouter le champ id? Vous pouvez éventuellement étendre les besoins de cette table d'une manière inattendue.

Juste une suggestion.

+0

Oui, bonne suggestion. Si jamais vous avez besoin d'ajouter des champs à votre table de jointure (par exemple 'date_joined',' score', etc.) la table aura besoin d'un id et vous devez alors référencer la table de jointure comme modèle distinct. –

3

CakePHP ne prend pas en charge les clés primaires composites. Ajoutez une clé primaire appelée 'id' à votre table game_players. Model-and-Database-Conventions

1

Dans le cours normal des choses que votre table de jointure doit effectivement être appelé games_players pas game_players - si la table est appelée game_players vous aurez alors besoin de dire ce gâteau dans vos fichiers modèles respectifs.

S'il s'agit simplement d'une table de jointure, il ne devrait normalement pas avoir besoin d'un champ id. Il y a des circonstances où vous voudrez ajouter l'id (ou d'autres champs) à votre table de jointure mais vous ne devez pas.

+0

Ancien poste, mais a commenté pour toute personne qui se trouve à courir à travers cela comme je l'ai fait. Je ne suis pas sûr si c'était le cas en 2009, mais actuellement ce n'est pas vrai. Je nomme généralement mes tableaux dans cette convention et gâteau Excité très bien: jeux game_players game_player_logs La dernière partie doit toujours être au pluriel, les autres singulier. –

0

Comme d'autres l'ont mentionné, votre table devrait s'appeler games_players et vous ne devriez jamais l'utiliser directement (le gâteau s'occupe de cela automagiquement). Vous devez configurer vos relations entre les modèles Game et Player, et laisser le gâteau s'occuper du reste.

8

var $primaryKey = 'example_id'; $ primaryKey est ce que vous cherchez.

Il suffit de placer ceci sur votre classe de modèle.

+1

+1 Juste ce que je voulais, je dois aimer SO :) – Angad

Questions connexes