2017-07-20 2 views
0

J'ai une application web CakePHP 3.4.6. En raison du fait qu'il fonctionne avec les tables de base de données héritées (non écrites dans Cake convention), nous avons choisi de coder manuellement toutes nos requêtes SQL plutôt que d'essayer de configurer les classes Table et Entity. Je sais que certaines personnes ne seront pas d'accord avec cela, mais ce n'est pas le but de la question. J'ai 3 bases de données: app_db, users_db, extra_db.CakePHP 3 - utiliser plusieurs connexions de base de données * sans ORM *

J'ai connexions configuré pour chacun dans config/app.php tel que:

'Datasources' => [ 
    'default' => [], // 'app_db' credentials 
    'users_db' => [], // 'users_db' credentials 
    'extra_db' => [], // 'extra_db' credentials 
]; 

J'ai un fichier de modèle personnalisé situé à src/Model/MyModel.php. Un exemple de celui-ci étant utilisé pour faire une requête sur un des bases de données (app_db) fonctionne comme ceci:

namespace App\Model; 

use Cake\Datasource\ConnectionManager; 

class MyModel 
{ 
    protected $connection; 

    public function __construct() 
    { 
     $this->connection = ConnectionManager::get('default'); 
    } 

    public function getData() 
    { 
     $sql = ''; // some SQL query 
     $stmt = $this->connection->prepare($sql); 
     $stmt->execute(); 
     return $stmt->fetchAll('assoc'); 
    } 
} 

Cela fonctionne parce qu'il obtient la connexion pour default qui mappe app_db. Mais, je veux maintenant exécuter une requête qui doit obtenir des données de app_db et JOIN avec des données de users_db.

Comment est-ce que je configure ceci dans le modèle pour que le SQL communique avec les autres bases de données?

Répondre

0

Une façon simple serait, d'avoir une autre méthode, qui va changer de connexion.

public function switchConnection($connection=''){ 
$this->connection = ConnectionManager::get(connection); 
} 

Raccrocher pour changer la connexion

MyModel->switchConnection('app_db'); 

prochaine fois que vous exécutez getData, il comuniquer avec app_db au lieu de défaut.