提问者:小点点

使用cakephp 3从不同的数据库检索关联模型


我正在开发一个应用程序,它将使用两个数据库:一个主数据库来存储应用程序的数据,另一个数据库将检查用户名和其他只读内容。所以我在app.php中设置了两个不同的连接:

 'Datasources' => [
    'default' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => '192.168.2.31',
        'username' => 'srddev',
        'password' => 'srddev',
        'database' => 'srddev',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,
        'log' => false,
        'quoteIdentifiers' => false,
    ],
'spd' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => '192.168.2.31',
        'username' => 'spddev',
        'password' => 'spddev',
        'database' => 'spddev',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'cacheMetadata' => true,
        'log' => false,
        'quoteIdentifiers' => false,
    ],

之后,我把一个方法放在我的Model/Table/UsersTable.php这样蛋糕就会知道这个表使用不同的数据库:

 public static function defaultConnectionName() {
     return 'spd';
   }

我正在使用这个表来验证用户,它工作正常。但是现在我想把这个模型和我的“pedidos”(订单)模型从我的主数据库中关联起来,但是它工作得不好。我正在尝试这个在我的儿科ontroller.php:

 public function index()
{
    $this->paginate = [
        'contain' => ['Users']
    ];
    $this->set('pedidos', $this->paginate($this->Pedidos));
    $this->set('_serialize', ['pedidos']);
}

但它不起作用。我得到以下错误:error:SQLSTATE[42S02]:找不到基表或视图:1146表的srddev。用户的不存在

嗯,我不应该在srddev数据库中查找这个表,它属于spddev,正如我在UsersTable中指出的那样。php。如何告诉cakephp应该在不同的连接中查询此表?

注:两个“数据库”实际上是同一台mysql服务器中的Schemma。我试图连接到spddev。用户表使用默认连接并配置$this-


共2个答案

匿名用户

您可以尝试将关联中的策略设置为选择。这可能会有帮助。目前还不完全支持跨模式关联。我做了一些工作,但不能解决所有的问题。

我不确定它是在哪一个CakePHP3版本中合并的,但我确实建议保持最新的发布周期。

匿名用户

它在我的项目中起作用

class {YourTableNameInCamelCase}Table extends Table
{
    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->setTable('{YourDBName}.{YourTableName}');

您不需要将策略设置为“选择”,因为它可能会导致查询限制。