validationdefault - save data cakephp 3
Como usar diferentes datasources em uma consulta usando o cakephp3? (1)
Estou trabalhando em um projeto CakePHP3 que possui 3 datascources diferentes.
Eu tenho um modelo principal, chamado application, que deve ter duas associações
hasOne()
para dois modelos com um datascource diferente como Model Application.
Eu criei os dois modelos e apontei as duas Model Tables para seus datascources com
defaultConnectionName()
.
Agora eu adicionei duas relações
hasOne()
ao meu objeto ApplicationsTable e recebi um erro sql, ao tentar
Applications->get()
.
Isso é claro, já que na instrução SQL não há nenhuma declaração de uma origem de dados na parte FROM e JOIN, como
SELECT * FROM datasource1.myTable
Eu dei uma olhada na classe ORM / Query da estrutura cakephp e o objeto Consulta parece ter apenas uma conexão de fonte de dados como um atributo de classe.
Existe uma maneira de usar diferentes datascources na recuperação de dados usando bolo ORM ou devo apenas usar uma consulta personalizada aqui?
Desde já, obrigado!
Por enquanto, o CakePHP não leva em consideração as configurações da fonte de dados ao criar junções, e não acho que isso será adicionado em um futuro próximo, até porque as junções cruzadas de banco de dados não são suportadas "out of the box" (como em, apenas prefixar o nome do banco de dados e você está configurado) no Postgres e no SQLite .
Supondo que você esteja usando um DBMS que ofereça suporte a junções de banco de dados cruzadas, o que você poderia fazer é alterar o nome da tabela usada para incluir também o nome do banco de dados, ie
databaseName.tableName
vez de apenas
tableName
public function initialize(array $config)
{
$this->table('databaseName.tableName');
// ...
}
ou dinamicamente
$this->table($this->connection()->config()['database'] . '.tableName');
SQLite
Para o SQLite, você pode fazer isso funcionar com bastante facilidade usando a
instrução
ATTACH DATABASE
, como pode ser visto na resposta vinculada acima.
Em sua aplicação CakePHP, você poderia emitir esta declaração em seu bootstrap ou onde quer que você precise id, algo como
use Cake\Datasource\ConnectionManager;
// ...
/* @var $connection \Cake\Database\Connection */
$connection = ConnectionManager::get('default');
$connection->execute('ATTACH DATABASE "db2.sqlite3" AS databaseName');
que
db2.sqlite3
o banco de dados
db2.sqlite3
com um nome de esquema de
databaseName
.
A partir daí, a solução de nome de tabela acima mencionada deve funcionar bem, pelo menos a não dinâmica, já que a dinâmica usaria algo como
db2.sqlite3
como o nome do esquema, o que não funcionaria.
Postgres
Eu não estou acostumado com o Postgres, então, neste ponto, não posso dar um exemplo, mas provavelmente ele deve funcionar similarmente usando wrappers de dados externos , ou seja, emite as instruções apropriadas inicialmente e apenas se refira ao nome do esquema especificado.