Laravel 4: Plusieurs Locataires de l'Application, chaque locataire de sa propre base de données et une base de données mondiale
Actuellement, j'ai une application qui héberge plusieurs locataires écrit dans CodeIgniter.
Mais je suis vraiment aimer Laravel 4 et je voudrais commencer la migration de l'application de Laravel.
Voici la configuration actuelle:
- Chaque locataire dispose de sa propre base de données.
- Il y a juste un ensemble de fichiers de l'application.
- Lorsque nous créons un nouveau locataire d'une nouvelle base de données est créée et un script d'installation est exécuté et la base de données est alimentée avec quelques informations de base.
- Chaque locataire dispose également de son propre sous-domaine. C'est pourquoi nous pouvons détecter base de données à utiliser.
- Il y a une base de données principale qui détient des informations sur les locataires et utilisateurs et de quelques autres tableaux.
- Lorsqu'un schéma de mise à jour est nécessaire nous, il suffit de créer un script de mise à jour qui sera exécuté pour chaque locataire. Cela se produit par l'intermédiaire d'un spécialement codé script CLI pour Codeigniter
Dans Codeigniter il est relativement facile de début et de fin de nouvelles connexions de base de données.
Avec Laravel j'ai les questions suivantes.
- Comment voulez-vous début/la fin de connexions de base de données à la volée?
- Je voudrais utiliser les Migrations, mais je tiens à les exécuter pour chaque locataire. Les Migrations actuellement sur la "main" connexion de base de données. Et il ne s'exécute qu'une fois.
- En va de même pour les semis..
Ce sont mes principales questions, j'ai d'autres choses mineures, mais ceux qui peuvent être contournées.
J'espère que quelqu'un peut jeter un peu de lumière..
Vous devez vous connecter pour publier un commentaire.
Je suis juste en prenant un coup de couteau à cela, alors soyez prévenus 🙂
Le DatabaseManager classe, qui est utilisé à chaque fois que vous appelez DB, a et étendre la méthode. Voici la lien vers la source. La DB::connexion() la méthode doit retourner une instance de Éclairer\Database\Connexion. De tout cela, je voudrais créer une nouvelle connexion de l'utilisateur comme suit:
Personnellement, je voudrais ajouter une nouvelle méthode pour chaque utilisateur, Utilisateur::databaseConnection(), et l'appeler quand j'étends le DatabaseManager.
Par le biais de votre demande, vous devriez être en mesure d'appeler un utilisateur enregistré de connexion via:
Mise à jour
Selon quelle fréquence et quand vous auriez du appeler le locataire de connexion, vous pouvez utiliser le conteneur IOC.
J'ai oublié sur les migrations et l'ensemencement. Pour les migrations, vous pouvez définir le chemin d'accès au fichier
Donc, si vous utilisez la configuration de la classe pour définir la valeur par défaut de la base de données ou de base de données::setDefaultConnection($username), je suppose que toutes les migrations et l'ensemencement sera fait pour la connexion en cours. Lors de ce processus, même si vous pouvez revenir à vous de base de données principale.
Mise à jour 2
La laravel les développeurs sont incroyables, et j'aurais certainement eu l'envie de le vérifier, plus tôt que plus tard. Vous pouvez faire des migrations et de la semence sur toute la base de données de connexion que vous avez créé.
À la recherche de Barry réponse, c'est probablement beaucoup plus simple que de prolonger la DatabaseManager.
Si vous voulez voir toutes les options de ces commandes, il suffit d'exécuter:
php artisan migrate --database='userConnectionName'
devrait fonctionner. Pour le semis, vous pouvez encore modifier la valeur par défaut de la connexion. Je dirais que vous avez quelques options si: (1) écrire une commande personnalisée qui ne le semis, ou (2) mettez dans une demande de fonctionnalité pour un --option de base de données pour les semis de commande.artisan db:seed --database='userConnectionName'
. Ces laravel les développeurs sont géniales!artisan migrate --seed --database=tenant
. La création d'un "locataire" connexion " puis en modifiant les options via Config::set() ressemble à la façon la plus propre pour accomplir ce que vous êtes après. Pour s'assurer d'un des locataires spécifique de la base de données est utilisée par les artisans, ajoutez le code pour régler/vérifier les options de connexion pour les start/artisan.php fichier.Vous pouvez créer 1 base de données avec le locataire de la base de données d'informations d'identification, et de définir de façon dynamique dans votre application:
Cela nécessitera de créer 2 connexions dans votre database.php fichier. (par exemple, application et locataire) et précisez dans votre modèle de base de données à utiliser (1 pour le stockage des locataires, 1 pour le locataire de base de données spécifique)
Et probablement de créer un itinéraire/script pour créer/mettre à jour les tables. Pas sûr au sujet des migrations avec plusieurs bases de données.
Vous pouvez créer des dynamiques DB connections dans laravel avec la syntaxe suivante
Avec qui
DB::connection('key'); would just work.
J'ai récemment rencontré un problème similaire, il fallait utiliser différentes Bases de données pour plusieurs modèles.
J'ai trouvé ce qui suit de faire le tour.
Dans votre filters.php ou routes.php ou du contrôleur de __construct méthode ajouter les éléments suivants:
$db = "obtenir votre nom de base de données';
Config::set('base de données.les connexions.MY_NEW_CONNECTION.la base de données',$db);
DB::setDefaultConnection('MY_NEW_CONNECTION');
1) Vous pouvez définir plusieurs nommée connexions dans votre database.php fichier de configuration
Vous pouvez alors choisir lequel utiliser avec quelque chose comme ça.
2) Ce n'est pas une solution complète car je pense qu'il faudra un peu de hacking sur le noyau, mais vous pouvez choisir la connexion à l'exécution d'une migration sur. Peut-être que vous pourriez parcourir la liste de vos locataires et de l'exécuter sur chacun d'eux.
3) Malheureusement, je ne pense pas que l'ensemencement prend en charge les connexions multiples, encore. Vous pourriez avoir à rouler vos propres semis fonctionnalité.