I’m developping an application that will use two databases: A main database to store the app’s data and a second one where I’ll check usernames and other read-only stuff. So I set up two different connections in my app.php:
'Datasources' => [ 'default' => [ 'className' => 'CakeDatabaseConnection', 'driver' => 'CakeDatabaseDriverMysql', 'persistent' => false, 'host' => '192.168.2.31', 'username' => 'srddev', 'password' => 'srddev', 'database' => 'srddev', 'encoding' => 'utf8', 'timezone' => 'UTC', 'cacheMetadata' => true, 'log' => false, 'quoteIdentifiers' => false, ], 'spd' => [ 'className' => 'CakeDatabaseConnection', 'driver' => 'CakeDatabaseDriverMysql', 'persistent' => false, 'host' => '192.168.2.31', 'username' => 'spddev', 'password' => 'spddev', 'database' => 'spddev', 'encoding' => 'utf8', 'timezone' => 'UTC', 'cacheMetadata' => true, 'log' => false, 'quoteIdentifiers' => false, ],
After that I put a method in my Model/Table/UsersTable.php so cake will know that this table uses a different database:
public static function defaultConnectionName() { return 'spd'; }
I’m using this table to authenticate users, it’s working fine. But now I want to associate this model with my “pedidos” (orders) model, from my main database, and it’s not working fine. I’m trying this in my PedidosController.php:
public function index() { $this->paginate = [ 'contain' => ['Users'] ]; $this->set('pedidos', $this->paginate($this->Pedidos)); $this->set('_serialize', ['pedidos']); }
But it’s not working. I’m getting the following error: Error: SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘srddev.users’ doesn’t exist
Well, I shouldn’t be looking for this table in the srddev database, it belongs to spddev, as I signaled in my UsersTable.php. How can I tell cakephp that this table should be queried in a different connection?
Ps.: Both “databases” are actually schemmas in the same mysql server. I tried to connect to spddev.users table using the default connection and configuring $this->table(‘spddev.users’);, but had no success.
Advertisement
Answer
You could try setting the strategy
in the association to select
. This might help. There’s no full support for cross schema associations yet. I’ve put some work into it but it won’t solve all cases.
I’m not sure in which CakePHP 3 version it got merged but I do recommend staying up-to-date with the release cycles.