2014-12-01 5 views
0

Так у меня есть мой database.php следующим образом:CakePHP useDbConfig не работает?

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 ....).

Любые идеи?

Заранее благодарен!

+0

Кстати, как вы видите, 'persistent' установлен в false в обеих конфигурациях – Pbal

ответ

0

Я просмотрел документацию CakePHP и не понял, почему это не работает, но я нашел подходящий WORKAROUND, который документирован, поэтому я не буду оценивать его как «неэлегантный». Если вы не согласны с моим ответом, пожалуйста, не «минус-1» меня ... Это решение действительно работает и решает мою проблему.

Я буду продолжать искать «правых» (лучший) способ и в конечном итоге получить возможность отправлять сюда ...

Во всяком случае, CakePHP позволяет установить Datasource вашей модели «на лету», и это было то, что закончилось работая для меня.

Сразу после $this->loadModel('Model'); введите строку, например $this->Model->setDatasource('datasource');, и она работает как шарм.

Это решило мою проблему в SHELL, но так как этот метод в соответствии с Типовым класса, это вероятно, будет работать в контроллерах, а также (http://api.cakephp.org/2.4/class-Model.html#_setDataSource)

0

Проблема здесь состоит в том, что методом:

$this->loadModel('Model'); 

как-то не инициирует модель правильно.

Вы должны использовать традиционный способ:

App:uses('MyModel', 'Model'); 
$this->MyModel = new MyModel(); 

У меня было трудно понять это ... Это может также решить многие другие проблемы.
Я предлагаю вам не использовать loadModel() в будущем ...