2015-04-24 11 views
5

Ho un'applicazione web istanziata che utilizza database diversi per ogni istanza ma utilizza gli stessi file.Ottieni le credenziali del database dal database principale, quindi connettersi al database diverso

Quello che voglio la mia domanda da fare su di avvio:

  1. credenziali del database ottiene da tavolo esempio master. Questa tabella di istanze si trova nella connessione predefinita "mysql" che ho definito in app/config/database.php.
  2. Connettersi al database di esempio, da quel momento in poi (non ho bisogno del database master dell'istanza più)

ho cercato di fare questo nella mia app: prima() evento, ma che non lavoro come non ho una tabella di sessioni nel mio database master. Se lo faccio prima dell'array return() in database.php ovviamente non può connettersi perché non ha ancora le credenziali del database master corrette.

Dove dovrei fare questo? Devo disabilitare solo le sessioni e farlo nella mia App :: before() e poi abilitare le sessioni dopo?

risposta

1

Dopo alcune ore di sperimentare e cercare ho trovato che l'opzione migliore è proprio quello di creare un'istanza DOP manualmente nel file /app/config/database.php e ottenere le credenziali del database in questo modo:

// Get instance row 
    if (!App::runningInConsole() && !array_key_exists('instance_found', $_ENV)) { 
     $conn = new PDO('mysql:dbname=instances;host=127.0.0.1', 'root', 'password'); 
     $stmt = $conn->prepare('SELECT * FROM instances WHERE http_host=?'); 
     $stmt->bindParam(1, $_SERVER['HTTP_HOST']); 
     $stmt->execute(); 

     $instance = $stmt->fetch(PDO::FETCH_OBJ); 
     $conn = null; 

     if (!$instance) { 
      return Response::make('Whoops!', 404); 
     } else { 
      $_ENV['instance_found'] = true; 

      $database = $instance->mysql_database; 
      $username = $instance->mysql_username; 
      $password = $instance->mysql_password; 
     } 
    } 
3

Non pensare che sia possibile, ma ecco una possibilità.

di lettura/scrittura Connessioni

A volte si potrebbe desiderare di utilizzare una connessione al database per SELECT dichiarazioni, e un altro per INSERT, UPDATE e DELETE dichiarazioni. Laravel lo rende un gioco da ragazzi, e le connessioni corrette saranno sempre utilizzate sia che si utilizzino query non elaborate, sia che si tratti di Query Builder o di Eloquent ORM.

Per vedere come lettura/scrittura connessioni dovrebbe essere configurato, diamo un'occhiata a questo esempio:

'mysql' => array(
    'read' => array(
     'host' => '192.168.1.1', 
    ), 
    'write' => array(
     'host' => '196.168.1.2' 
    ), 
    'driver' => 'mysql', 
    'database' => 'database', 
    'username' => 'root', 
    'password' => '', 
    'charset' => 'utf8', 
    'collation' => 'utf8_unicode_ci', 
    'prefix' => '', 
), 

Nota che due chiavi sono state aggiunte alla matrice di configurazione: lettura e scrittura. Entrambe queste chiavi hanno valori di array contenenti una singola chiave: host. Il resto delle opzioni del database per le connessioni di lettura e scrittura verrà unito dall'array mysql principale. Quindi, abbiamo solo bisogno di inserire elementi negli array di lettura e scrittura se vogliamo sovrascrivere i valori nell'array principale. Quindi, in questo caso, verrà utilizzato come connessione "lettura" 192.168.1.1, mentre come connessione "scrittura" verrà utilizzato il numero 192.168.1.2. Le credenziali del database, il prefisso, il set di caratteri e tutte le altre opzioni dell'array mysql principale saranno condivise su entrambe le connessioni.

+0

Cool, non lo sapevo! Ma questo non risolve il mio problema. Ho bisogno sia dell'accesso in lettura che in scrittura sul database dell'istanza. – Basaa