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.





cross-database