【问题标题】:CakePHP useDbConfig not working?CakePHP useDbConfig 不工作?
【发布时间】:2014-12-01 19:35:16
【问题描述】:

所以我的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);
  (...)

Model1 使用$default,Model2 使用$db2。 Model2.php 如下(sn-p):

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

有什么想法吗?

提前致谢!

【问题讨论】:

  • 顺便说一句,正如你所见,persistent 在两个配置中都设置为 false

标签: php cakephp cakephp-2.0 cakephp-model


【解决方案1】:

我浏览了 CakePHP 的文档,但无法理解为什么这不起作用,但我确实找到了一个合适的 WORKAROUND,它已记录在案,因此我不会将其评为“不优雅”。如果您不同意我的回答,请不要“减 1”我...此解决方案确实有效并解决了我的问题。

我会继续寻找“正确”(最好的)方式,并最终回到这里......

无论如何,CakePHP 允许您“即时”设置模型的数据源,而这最终对我有用。

$this-&gt;loadModel('Model'); 之后放置一个类似$this-&gt;Model-&gt;setDatasource('datasource'); 的行,它就像一个魅力。

这解决了我在 SHELL 中的问题,但由于该方法在模型类下,它可能也适用于 CONTROLLER (http://api.cakephp.org/2.4/class-Model.html#_setDataSource)

【讨论】:

    【解决方案2】:

    这里的问题在于方法:

    $this->loadModel('Model');
    

    不知何故无法正确启动模型。

    你应该使用传统的方式:

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

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

    【讨论】:

      【解决方案3】:

      我刚刚意识到您无法在属于不同数据库的表之间建立连接,即使您正确配置了数据库连接。

      事实上,查询生成器没有在查询中包含 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 中创建一个视图,它映射 db2 的表 b

      CREATE VIEW b AS SELECT * FROM db2.b;
      

      这样我可以在b表的cakephp中正常工作,而不知道数据来自db2

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-06
        • 2019-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多