Как использовать разные источники данных в запросе с помощью cakephp3?

Я работаю над проектом cakePHP3, в котором есть 3 разных источника данных. У меня есть одна основная модель, называемая приложением, которая должна иметь две ассоциации hasOne() с двумя моделями с другим источником данных в качестве приложения модели. Я создал две модели и указал две таблицы моделей на их источники данных с помощью defaultConnectionName().

Теперь я добавил два отношения hasOne() к моему объекту ApplicationsTable и получил ошибку sql при попытке Applications->get(). Это ясно, так как в инструкции SQL нет никакого указания источника данных в части FROM и JOIN, например SELECT * FROM datasource1.myTable

Я просмотрел класс ORM/Query фреймворка cakephp, и объект Query, похоже, имеет только одно соединение с источником данных в качестве атрибута класса.

Есть ли способ использовать разные источники данных при поиске данных с использованием торта ORM, или я должен просто использовать здесь собственный запрос?

Заранее спасибо!


person Seb    schedule 16.08.2015    source источник


Ответы (1)


На данный момент CakePHP не учитывает конфигурации источника данных при создании соединений, и я не думаю, что это будет добавлено в ближайшем будущем, не в последнюю очередь потому, что соединения между базами данных не поддерживаются «из коробки» (как в, просто добавьте имя базы данных, и все готово) в Postgres и SQLite.

Предполагая, что вы используете СУБД, которая поддерживает соединения между БД, вы можете изменить имя используемой таблицы, чтобы оно также включало имя базы данных, т.е. databaseName.tableName вместо tableName.

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

или динамически

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

SQLite

Для SQLite вы можете легко заставить это работать с помощью ATTACH DATABASE , как видно из связанного ответа выше. В вашем приложении CakePHP вы можете выполнить этот оператор в начальной загрузке или в любом другом месте, где вам нужен идентификатор, что-то вроде

use Cake\Datasource\ConnectionManager;

// ...

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

который прикрепит базу данных db2.sqlite3 с именем схемы databaseName. С этого момента вышеупомянутое решение для имени таблицы должно работать нормально, по крайней мере, нединамическое, поскольку динамическое будет использовать что-то вроде db2.sqlite3 в качестве имени схемы, что не сработает.

Постгрес

Я не привык к Postgres, поэтому на данный момент я не могу привести вам пример, но, вероятно, он должен работать аналогично с использованием внешние обёртки данных, т. е. сначала выдать правильные операторы, а затем просто ссылаться на указанное имя схемы.

person ndm    schedule 16.08.2015