CakePHP useDbConfig无法正常工作?

0yycz8jy  于 2022-11-12  发布在  PHP
关注(0)|答案(3)|浏览(150)

我的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代码,它试图在一个DB中“找到”一些字段,以便它可以与另一个DB中的其他字段进行交叉检查,如下所示:

(...)
$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);
  (...)

Model 1使用$default,Model 2使用$db2。Model2.php如下所示(代码片段):

public $useTable = 'Table';
public $primaryKey = 'key';
public $useDbConfig = "db2";

不幸的是,CakePHP似乎没有切换连接和/或DB,因为我得到了Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Model2.field1' in 'field list'
调试显示CakePHP在构建SQL语句(select ... from DEFAULT.MODEL2TABEL as MODEL2 ....)时尝试使用默认的DB。
有什么想法吗?
提前感谢!

ma8fv8wu

ma8fv8wu1#

我浏览了CakePHP的文档,不明白为什么这个方法不起作用,但我确实找到了一个合适的解决方案,这个解决方案有文档记录,所以我不会认为它“不优雅”。如果你不同意我的答案,请不要“减1”我...这个解决方案确实起作用,解决了我的问题。
我会继续寻找“正确”(最好)的方式,并最终张贴回到这里...
无论如何,CakePHP允许你“在运行中”设置你的模型的数据源,这就是我最终的工作。
就在$this->loadModel('Model');之后放一条像$this->Model->setDatasource('datasource');这样的线,它的工作就像一个魅力。
这解决了我在SHELL中的问题,但是由于该方法在Model类下,因此它可能也可以在CONTROLLER中工作(http://api.cakephp.org/2.4/class-Model.html#_setDataSource)

mcdcgff0

mcdcgff02#

这里的问题在于方法:

$this->loadModel('Model');

无法正确启动模型。
你应该用传统的方式:

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

我很难弄清楚这一点...这可能也解决了许多其他问题。
我建议你以后选择避免使用loadModel() ...

jljoyd4f

jljoyd4f3#

我刚刚意识到,你 * 不能在属于不同数据库的表之间建立连接 *,即使你正确地配置了数据库连接。
事实上,查询生成器在查询中不包括dbname。
因此,如果您有:

  • db1.a ##这是db1中的表a
  • db2.b ##这是db2中的表b

您从cakephp2 ORM得到是:

select a.id, b.id from a inner join b on (a.b_id == b.id) ##NOT WORKING

而不是

select a.id, b.id from db1.a a inner join db2.b b on (a.b_id == b.id) ##WORKING

我的解决方案将问题转移到数据库。我只是在db1中创建一个视图,它Mapdb2的表b

CREATE VIEW b AS SELECT * FROM db2.b;

这样,我就可以在cakephp中正常地处理表b,而不必知道数据来自db2

相关问题