Итак, у меня есть свой database.php следующим образом:
public $default = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'SOMEHOST',
'port' => 8889,
'login' => 'LOGIN',
'password' => 'PASSWORD',
'database' => 'DB1',
'prefix' => '',
'encoding' => 'utf8',
);
public $db2 = array(
'datasource' => 'Datasources.Freetds',
'persistent' => false,
'host' => 'SOMEHOST',
'port'=> 1433,
'login' => 'LOGIN',
'password' => 'PASSWORD',
'database' => 'DB2',
'prefix' => '',
'encoding' => 'utf8',
);
Затем у меня есть некоторый код SHELL, который пытается «найти» некоторые поля в одной БД, чтобы он мог перепроверить другие поля в другой БД следующим образом:
(...)
$qry = $this->Model1->find('all', array(
'fields' => array('Model1.id','Model1.field1'),
'conditions' => array(
'Model1.field2' => 'WAITING'),
'recursive' => -1));
$this->loadModel('Model2');
$num_reg=count($qry);
for ($loop=0; $loop<$num_reg;$loop++) {
$registro = $this->Model2->find("first", array(
'recursive' => -1,
'fields' => array ('Model2.field1', 'Model2.field2'),
'conditions' => array ('Model2.field1' => $qry[$loop]['Model1']['field1'])));
var_dump($registro);
(...)
Model1 использует $default
и Model2 использует $db2
, Model2.php следует (фрагмент):
public $useTable = 'Table';
public $primaryKey = 'key';
public $useDbConfig = "db2";
К сожалению, CakePHP, похоже, не переключает соединения и / или БД, так как я получаю Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Model2.field1' in 'field list'
,
Отладка показала мне, что CakePHP пытается использовать базу данных по умолчанию при построении оператора SQL (select ... from DEFAULT.MODEL2TABEL as MODEL2 ....
).
Есть идеи?
Заранее спасибо!
Я просмотрел документацию CakePHP и не смог понять, почему это не работает, но я нашел подходящий обходной путь, который задокументирован, поэтому я не буду оценивать его как «не элегантный». Если вы не согласны с моим ответом, пожалуйста, не «минус 1» меня … Это решение работает и решает мою проблему.
Я буду продолжать искать «правильный» (лучший) способ и в конечном итоге опубликовать здесь …
В любом случае, CakePHP позволяет вам настроить источник данных вашей модели «на лету», и это было то, что в итоге помогло мне.
Сразу после $this->loadModel('Model');
поместите строку как $this->Model->setDatasource('datasource');
и это сработало как шарм.
Это решило мою проблему в SHELL, но поскольку метод находится в классе модели, он, вероятно, будет работать и в контроллерах (http://api.cakephp.org/2.4/class-Model.html#_setDataSource)
Проблема здесь в том, что метод:
$this->loadModel('Model');
как-то не правильно инициирует модель.
Вы должны использовать традиционный способ:
App:uses('MyModel', 'Model');
$this->MyModel = new MyModel();
Мне было трудно понять это … Это также может решить многие другие проблемы.
Я предлагаю вам отказаться от использования loadModel()
в будущем…