Comment utiliser dynamiquement plusieurs bases de données pour un modèle dans CakePHP
Ok, ma première question a été modifiée de nombreuses fois que j'ai choisi de le supprimer et de reformuler ma question. J'ai fait un petit test du projet avec les différents modèle-noms pour trouver une solution à mon problème.
Avertissement: Ne pas mélanger la bases de données avec tables
Motivation: je me suis séparé de l'utilisateur des données dans plusieurs bases de données juridique & des problèmes de performances.
Actuellement, je travaille sur un CakePHP projet qui a de multiples User
's et chaque User
a sa propre base de données avec plusieurs tables (cars
est l'un des tables). Maintenant, j'ai besoin d'expliquer quelque chose d'abord:
Chaque User
a son propre base de données (pas une table, un base de données), de sorte que les noms de base de données sont comme suit.
- [BASE de données]
app
(C'est l'application principale de la base de données)- [TABLE]
users
- [TABLE]
permissions
(Pas pertinent pour cette question)
- [TABLE]
- [BASE de données]
app_user1
(User.id
1 est propriétaire de l'ensemble de ce base de données)- [TABLE]
cars
(un table entièrement détenue parUser.id
1)
- [TABLE]
- [BASE de données]
app_user2
(User.id
2 est propriétaire de l'ensemble de ce base de données)- [TABLE]
cars
(un table entièrement détenue parUser.id
2)
- [TABLE]
- etc...
J'ai fait un petit dessin qui pourrait clarifier la base de données /table -définitions et leurs relations avec les modèles:
Le problème!!!!!!
Je ne sais pas qui base de données connecter jusqu'à ce que le User
connecte. User
's et de leurs bases de données sont créés dynamiquement, donc je ne peux pas utiliser app/Config/database.php
.
Je suis donc actuellement à la rédaction d'une extension sur le Model
et ConnectionManager
classes de contourner CakePHP de base de comportements de base de données. Ainsi, le Car
modèle sait qui base de données à utiliser. Mais j'ai juste un sentiment que cela pourrait être fait plus facile!
Donc je suppose que tout cela se résume à une seule question:
Est-il un moyen plus facile de faire cela?!
Merci à toute personne qui prendra le temps et l'effort de la lecture et de la compréhension de mon problème!!!!
source d'informationauteur Ariaan
Vous devez vous connecter pour publier un commentaire.
Ce monsieur (Olivier) avait le même problème! (Il y a un an) Il a écrit une petite adaptation pour la
Controller
s! Il est assez petit et il s'avère, il travaille dans 1.3 et 2.x.De toute façon, c'est ma dernière solution, que j'ai mis dans le
app/Model/AppModel.php
:Et voici comment je l'ai utilisé dans mon
app/Controller/CarsController.php
:Je suis de paris, je ne suis pas le premier ou le seul à avoir ce problème. Donc j'espère vraiment que cette information permettra de trouver des personnes & CakePHP communauté.
Je n'aime pas l'idée d'écrire le nom de la base de données dans le code.
Pour de multiples bases de données, vous avez le database.php fichier dans lequel vous pouvez définir autant de bases de données que vous en avez besoin.
Si vous voulez "switch" d'une base de données pour un modèle spécifique à la voléeutilisez le setDataSource méthode. (voir ici)
Par exemple, si vous avez deux bases de données, vous pouvez les définir dans l'database.php fichier comme "par défaut" et "bac à sable", comme un exemple.
Puis, dans votre code:
Le bac à sable est le nom de la configuration, et le nom de la base de données est écrit qu'une seule fois dans la database.php fichier.
Vous pouvez toujours interroger les bases de données à l'aide de notation complète dans mysql. F. ex.:
Gâteau façon:
Dans votre database.php
Dans votre contrôleur, vous pouvez utiliser
appliquer ensuite la requête comme
C'est un peuple de la accepté de répondre. Cela permettra d'éviter l'erreur si la nouvelle source de données a déjà existé: