Connexion à plusieurs bases de données pour un seul modèle dans CakePHP
Dans CakePHP, gérer les données de plusieurs bases de données peut être une tâche difficile. Cette question plonge dans un scénario dans lequel chaque utilisateur possède sa propre base de données et le défi réside dans la connexion dynamique à la bonne base de données sans coder en dur les noms de bases de données.
Séparation des bases de données spécifiques à l'utilisateur
Les données utilisateur sont divisées en bases de données individuelles pour répondre à des problèmes juridiques et de performances. Chaque base de données héberge plusieurs tables, dont une table « voitures » pertinente pour cette question.
Relations utilisateur-base de données
Les noms des bases de données sont structurés comme suit :
Mappage base de données-table
Le diagramme fourni illustre clairement la relation entre les bases de données et les tables dans cette configuration.
Connexion dynamique à la base de données
Le nœud du problème est d'identifier la bonne base de données à laquelle se connecter en fonction de l'utilisateur qui se connecte. Étant donné que ces bases de données et ces utilisateurs sont créés dynamiquement, modifier le fichier app/Config/database.php n'est pas réalisable.
Extension du modèle et de ConnectionManager
Pour contourner le comportement par défaut de la base de données de CakePHP, le développeur a envisagé d'étendre les classes Model et ConnectionManager. Cependant, une solution plus simple a été découverte.
Extension AppModel
La solution finale consiste à modifier le fichier AppModel.php comme suit :
class AppModel extends Model { public function setDatabase($database, $datasource = 'default') { ... (Database configuration logic) ... if ( $ds = ConnectionManager::create($nds, $db->config) ) { ... (Set Model configuration) ... return true; } return false; } }
Cette extension fournit une fonction permettant de définir dynamiquement la connexion à la base de données pour un modèle.
Exemple de contrôleur
Dans le fichier CarsController.php, la méthode setDatabase peut être utilisée comme suit :
class CarsController extends AppController { public function index() { $this->Car->setDatabase('cake_sandbox_client3'); ... } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!