¿Cómo usar diferentes fonts de datos en una consulta usando cakephp3?

Estoy trabajando en un proyecto cakePHP3 que tiene 3 fonts de datos diferentes. Tengo un modelo principal, llamado aplicación, que debe tener dos asociaciones de hasOne() para dos modelos con un origen de datos diferente como Aplicación de modelo. Creé los dos modelos y apunté las dos tablas de modelos a sus fonts de datos con defaultConnectionName() .

Ahora agregué dos relaciones de hasOne() a mi objeto ApplicationsTable y recibí un error de sql al intentar Applications->get() . Esto es claro ya que en la statement SQL no hay ninguna statement de un origen de datos en la parte FROM y JOIN, como SELECT * FROM datasource1.myTable

Eché un vistazo a la clase ORM / Query del framework cakephp y el objeto Query solo parece tener una conexión de origen de datos como atributo de clase.

¿Hay alguna manera de utilizar diferentes fonts de datos en la recuperación de datos usando cake ORM o debería usar una consulta personalizada aquí?

¡Gracias por adelantado!

Por ahora, CakePHP no tiene en cuenta las configuraciones de la fuente de datos al crear combinaciones, y no creo que esto se agregue en el futuro cercano, sobre todo porque las combinaciones cruzadas de bases de datos no son compatibles “de fábrica” ​​(como in, solo antepone el nombre de la base de datos y está configurado) en Postgres y SQLite .

Suponiendo que está utilizando un DBMS que admita uniones cruzadas de DB, lo que podría hacer es cambiar el nombre de la tabla utilizada para incluir también el nombre de la base de datos, es decir, databaseName.tableName lugar de simplemente tableName

 public function initialize(array $config) { $this->table('databaseName.tableName'); // ... } 

o dinámicamente

 $this->table($this->connection()->config()['database'] . '.tableName'); 

SQLite

Para SQLite puede hacer que esto funcione con bastante facilidad usando la sentencia ATTACH DATABASE , como se puede ver en la respuesta vinculada anteriormente. En su aplicación CakePHP, podría emitir esta statement en su arranque o donde lo necesite, algo así como

 use Cake\Datasource\ConnectionManager; // ... /* @var $connection \Cake\Database\Connection */ $connection = ConnectionManager::get('default'); $connection->execute('ATTACH DATABASE "db2.sqlite3" AS databaseName'); 

que adjuntaría la base de datos db2.sqlite3 con un nombre de esquema de databaseName . A partir de ahí, la solución de nombre de tabla mencionada anteriormente debería funcionar bien, al menos la solución no dinámica, ya que la dinámica usaría algo como db2.sqlite3 como nombre de esquema, lo que no funcionaría.

Postgres

No estoy acostumbrado a Postgres, por lo que en este momento no puedo darte un ejemplo, pero probablemente debería funcionar de manera similar utilizando contenedores de datos externos , es decir, emita los enunciados correctos inicialmente, y luego solo refiérase al nombre de esquema especificado.

    Intereting Posts