2016-08-03 7 views
1

Я создаю приложение для многих арендаторов, и у каждого арендатора есть своя база данных. Имя базы данных совпадает с идентификатором арендатора (идентификатор существует из пяти номеров). После аутентификации пользователь должен быть подключен к своей собственной базе данных и перенаправлен на свою панель.Orchestral/tenanti multi database

Я пытался связать пользователя с его базой данных с помощью следующего кода, который я поместил в Authenticate.php

if (!Auth::guest() && Auth::user()->tenant) { 
     $user = Auth::id(); 
     Tenanti::driver('user')->asDefaultDatabase($user, 'users_{id}'); 
     Config::set('database.connections.mysql.database', 'user_'.$user); 
    } 

если заявление проверяет в основной базе данных, если зарегистрированный пользователь является арендатором (булево).

Конфигурационный/database.php содержит следующий код:

'tenants' => [ 
     'user_1' => [ 
      'driver' => 'mysql', 
      'host'  => 'localhost',  // for user with id=1 
      'database' => '86097',  // for user with id=1 
      'username' => 'root', // for user with id=1 
      'password' => 'root', // for user with id=1 
      'charset' => 'utf8', 
      'collation' => 'utf8_unicode_ci', 
      'prefix' => '', 
      'strict' => false, 
      ], 
     ], 

AppServiceProvider:

<?php namespace App\Providers; 

use Orchestra\Support\Facades\Tenanti; 

class AppServiceProvider extends ServiceProvider 
{ 
    public function boot() 
{ 
    Tenanti::setupMultiDatabase('tenants', function (User $entity, array $template) { 
     $template['database'] = "user_{$entity->getKey()}"; 

     return $template; 
    }); 
} 
} 
?> 

Я не получаю сообщение об ошибке, но соединение не изменилось. База данных пользователя пуста, поэтому я не вижу никаких данных при входе в систему с user_id = 1. Заранее благодарим за помощь.

ответ

1

Конфигурация должна быть:

'tenants' => [ 
    'driver' => 'mysql', 
    'host'  => 'localhost',  // for user with id=1 
    'database' => '86097',  // for user with id=1 
    'username' => 'root', // for user with id=1 
    'password' => 'root', // for user with id=1 
    'charset' => 'utf8', 
    'collation' => 'utf8_unicode_ci', 
    'prefix' => '', 
    'strict' => false, 
], 

Кроме этого, пожалуйста, замените Tenanti::setupMultiDatabase() с Tenanti::connection() (мы возражали старый метод).

И изменить следующие:

Tenanti :: драйвер ('пользователь') -> asDefaultConnection (Auth :: пользователя(), 'tenants_ {ID}');

Очевидно, что если вы хотите использовать users_{id}, тогда вам необходимо будет заменить все tenants на users.

+0

Я изменил вышеуказанные вещи, но данные все еще появляются, однако база данных арендаторов полностью пуста. Кроме того, как я могу добавить второго и третьего пользователей, когда конфигурация существует только для пользователя с id = 1? – Novy

+0

Прочтите https://github.com/orchestral/tenanti#setup-model-observer Чтобы быть честным, лучше понять концепцию построения многопользователя в одной базе данных, прежде чем пропустить множество вещей и предположить, что установка одним щелчком будет решать все. Некоторые пример кода: https://github.com/crynobone/todoist/compare/master...single-database https://github.com/crynobone/todoist/compare/single-database .. .multi-database p/s: он неполный, так как я никогда не проектировал его для решения всего. – crynobone

+0

Мне удалось реализовать базу данных с несколькими арендаторами. Спасибо за полезный пример. Требуется ли модификация приложения для внесения изменений в систему с несколькими базами данных? Каждый пользователь имеет по крайней мере четыре большие таблицы (более одного миллиона строк каждая). Поэтому я считаю, что лучшим решением является наличие системы с несколькими базами данных. Поправьте меня, если я ошибаюсь. – Novy