2013-03-13 5 views
1

specs: PHP 5 avec MySQL construit sur Codeigniter Framework.Comment structurer un appel de base de données php?

J'ai une table de base de données appelée game et puis des tableaux spécifiques au sport comme soccerGame et footballGame. ces tables spécifiques au sport ont un champ gameId qui renvoie au tableau game. J'ai les classes correspondantes game et soccerGame/footballGame, qui s'étendent tous les deux game.

Lorsque je consulte les informations de jeu à afficher à l'attention de l'utilisateur, je n'arrive pas à trouver comment relier dynamiquement les deux tables. Je suis curieux de savoir s'il est possible d'obtenir toutes les informations avec une seule requête. Le problème est, j'ai besoin d'interroger la table game d'abord pour comprendre le nom du sport.

Si ce n'est pas possible, ma prochaine pensée est de le faire avec deux requêtes. demandez à ma game_model d'interroger la table de jeu, puis, en fonction du nom du sport, appelez le modèle spécifique au sport approprié (c'est-à-dire soccer_game_model) et obtenez les informations spécifiques au sport.

Je voudrais aussi passer l'objet game dans le soccer_model et le soccer_model utiliseraient cet objet pour me construire un objet soccerGame. Cela me semble un peu stupide parce que je construis l'objet parent et que je le donne à la classe qui s'étend pour créer un nouvel objet.

pensées?

merci pour l'aide.

EDIT:

table de jeu

gameId 
sport (soccer, basketball, football, etc) 
date 
other data 

table soccerGame

soccerGameId 
gameId 
soccer specific information 

table footballGame

footballGameId 
gameId 
football specific information 

et ainsi de suite pour d'autres sports

J'ai donc besoin de savoir ce qu'est le sport avant de pouvoir décider quelle table spécifique au sport je dois utiliser.

MISE À JOUR:

Merci à tous pour l'entrée. Il semble que le SQL dynamique n'est possible que grâce à des procédures stockées, quelque chose que je ne connais pas très bien maintenant. Et même avec eux, c'est toujours un peu brouillon. En ce moment, je vais aller sur la route de deux requêtes, l'un pour obtenir le nom du sport, puis un interrupteur pour obtenir le bon modèle.

Du côté PHP des choses maintenant, il semble un peu ridicule pour obtenir un objet game, passer à, disons, mon soccer_game_model, et alors que je retourne un objet soccer_game, qui est un enfant du game d'origine . Est-ce ainsi que cela doit être fait? ou est-ce que je manque quelque chose d'une perspective OO ici?

+0

Je n'arrive pas à comprendre le problème et la configuration. Pouvez-vous poster la structure de vos tables? – SomeSillyName

Répondre

1

Pour étendre sur la réponse de Devin Young, vous y parvenir en utilisant la classe d'enregistrement actif Codeigniter comme ceci:

public function get_game_by_id($game_id, $table) 
{ 
    return $this->db->join('game', 'game.id = ' . $table . '.gameId', 'left') 
    ->where($table . '.gameId', $game_id) 
    ->get('game') 
    ->result(); 
} 

donc, vous joindre à la table par le gameid qui est partagé, puis en utilisant une clause where de trouver la bonne. Enfin, vous utilisez result() pour retourner un tableau d'objets.

EDIT: J'ai ajouté une deuxième table paramater pour vous permettre de passer au nom de la table, vous pouvez rejoindre soit soccerGame, table footballGame etc.

Si vous ne savez pas quel sport choisir au Ce point dans le programme, alors vous pouvez prendre un peu de recul et regarder comment vous pouvez ajouter cela afin que vous sachiez. Je serais réticent à ajouter plusieurs jointures à toutes les tables de sport car vous rencontrerez des problèmes sur toute la ligne.

+0

merci pour le commentaire. le problème n'est pas comment faire des jointures, le problème est de savoir quelle table rejoindre. certaines tables 'game' peuvent devoir se joindre à la table' footballGame', alors que d'autres doivent se joindre à la table 'soccerGame'. –

+0

Je regarderais la conception globale de votre application car la seule autre façon serait de parcourir les tables jusqu'à ce que vous trouviez une correspondance. Peut-être stocker le type de jeu dans la table de jeu serait et idée. Si le nom correspond à la table, une recherche sur la bonne table en utilisant la méthode ci-dessus serait facile. Je suppose qu'un jeu ne peut être qu'un type, par exemple. football, football bien sûr. – jimbo2087

+0

la table 'game' sait ce qu'est le sport. puis-je utiliser cela pour rejoindre dynamiquement la bonne table? la façon dont vous suggérez nécessiterait un appel d'abord à la table 'game' et ensuite à la table' soccerGame'. Peut-être que c'est le seul moyen, mais j'espérais que quelqu'un connaissait un moyen d'utiliser une seule requête. –

1

MISE À JOUR

Tenir compte passer le paramètre "sport" quand vous regardez les données de jeu. Comme un champ caché, le plus probable.Vous pouvez ensuite utiliser une instruction switch dans votre modèle:

switch($gameValue) { 
    case 'football': $gameTable = "footballGame"; break; 
    case 'soccer': $gameTable = "soccerGame"; break; 
} 

fondons Ensuite, votre requête de ceci:

"SELECT * 
FROM ". $gameTable . " 
...etc 

Vous pouvez combiner les tables avec des jointures. http://www.w3schools.com/sql/sql_join.asp

Par exemple, si vous avez besoin d'obtenir toutes les données de game et footballGame basée sur une footballGameId de 15:

SELECT * 
FROM footballGame a 
LEFT OUTER JOIN game b ON a.id = b.gameId 
WHERE footballGameId = 15 
+0

yup, je connais bien les jointures. Le problème est que je ne sais pas à quelle table me joindre avant d'avoir obtenu des informations de la table 'game'. il peut ne pas être possible sans deux requêtes. curieux si c'était –

+0

merci pour la mise à jour. la table 'game' sait à quel sport elle appartient donc c'est certainement une option, et une suggestion que d'autres ont donné. Je suppose que j'étais curieux de savoir s'il est possible de le faire avec 1 requête. c'est à dire. utiliser dynamiquement le nom de champ de la première table pour le nom de table de la table jointe. –

1

Check this Stack Overflow answer for options sur la façon de le faire via une requête standard. Vous pouvez ensuite le transformer en enregistrement actif si vous le souhaitez (bien que cela puisse être compliqué et ne pas valoir le coup si vous n'avez pas besoin d'appels DB-agnostic dans votre application).

Fow ce que ça vaut, il n'y a rien de mal à faire plusieurs requêtes, il pourrait être plus lent qu'une alternative. Essayez quelques options, voyez ce qui fonctionne le mieux pour vous et votre application.

+0

merci pour le lien. Je pense que cela se rapproche d'une réponse, et cela me ramène à quelque chose d'autre auquel j'avais pensé. Est-il possible d'utiliser un nom de champ comme nom de table dans une jointure? c'est-à-dire SELECT 'tableName' FROM' game' comme g LEFT JOIN g.'tableName' comme newTable. Est-ce possible? btw, je suis actuellement en utilisant AR sur tout le site –

+0

Non, vous ne pouvez pas. Le mieux que vous pouvez faire est quelque chose comme ça (qui vient avec ses propres mises en garde): http://stackoverflow.com/questions/8171592/mysql-join-tables-based-on-column-data-and-table-name –

Questions connexes