2009-11-24 8 views
4

Est-il possible que certains modèles soient dans une base de données et d'autres dans une autre (utilisant la même connexion)?CakePHP utilisant plusieurs bases de données pour les modèles

J'ai un certain nombre de tables en lecture seule que je veux partager entre plusieurs installations de mon système. Les autres tables doivent être par installation. Pour l'exemple, disons users est la table partagée, et posts est par installation. Dans un schéma (appelons-le "partagé"), nous avons la table users, et dans un autre schéma ("mycake") posts. J'ai pu obtenir le modèle utilisateur lisant à partir de l'autre base de données en créant une nouvelle connexion à la base de données partagée (bien que les deux bases de données soient sur le même hôte et soient accessibles avec les mêmes informations de connexion).

class User extends AppModel { 
    var $useDBConfig = 'sharedConnection'; 
} 

Le problème est quand vient le temps de se joindre à la table posts. Il n'ajoute pas le nom du schéma au nom de la table et ne peut donc pas trouver posts.

// what it does 
SELECT * FROM users User INNER JOIN posts Post ... 

// what I'd like it to do: 
SELECT * FROM shared.users User INNER JOIN mycake.posts Post ... 

Donc, fondamentalement, est-il un moyen d'attribuer un nom de table complet à un modèle et le forcer à utiliser que dans toutes ses requêtes? Réglage var $useTable = 'shared.users'; n'aide pas ...

+0

Ceci est une bonne question. En choisissant un framework (en PHP), je vérifie toujours si le framework le permettra. – wenbert

Répondre

1

This site a un moyen de le faire, mais c'est un peu hacky.

+0

heh - "petit" est un peu un euphémisme. Je vais essayer de toute façon. – nickf

+0

C'est un peu dépassé, mais j'ai réussi à le bidouiller pour le faire fonctionner. – nickf

+0

bon à savoir =) – Galen

1

J'ai construit un site dans CakePHP qui a des modèles utilisant différentes bases de données et je n'ai jamais eu de problème avec les jointures entre différentes bases de données - le framework semblait prendre soin de tout ça pour moi. Bien que vous pourriez avoir besoin d'indiquer explicitement les tables de base de données utilisées dans vos modèles pour le faire fonctionner.

+0

comment avez-vous fait cela? – nickf

+1

Je viens d'utiliser différents détails de connexion pour chaque base de données. De mémoire quand ils ont partagé le login il y avait des problèmes. –

0

Pour activer la base de données pour le modèle,

Utilisez l'espace de noms dans le contrôleur/modèle

use Cake\Datasource\ConnectionManager; 

dans le contrôleur; -

$conn = ConnectionManager::get('remote_db_1'); 
$this->ModelName->connection($conn); 

Dans le modèle: -

$conn = ConnectionManager::get('remote_db_1'); 
$this->connection($conn); 

Remarque: - Si vous enregistrez également des données pour les tables associées, gardez à l'esprit pour modifier le DB pour les données associées sinon les données pour la table associée sera insérée dans la connexion par défaut/DB.

Ceci est la réponse pour CakePHP 3. *

Questions connexes