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

kq4fsx7k  于 2022-11-11  发布在  PHP
关注(0)|答案(2)|浏览(177)

我正在开发一个应用程序,它将使用两个数据库:一个主数据库用来存储应用程序的数据,另一个用来检查用户名和其他只读数据。因此,我在我的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中放入一个方法,这样cake就知道这个表使用了不同的数据库:

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

我使用这个表来验证用户,它运行得很好。但是现在我想把这个模型和我的主数据库中的“pedidos”(订单)模型关联起来,它运行得不好。我在我的PedidosController.php中尝试了这个方法:

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

但它不工作。我得到以下错误:错误:SQLSTATE[42 S 02]:找不到基表或视图:1146表格'srddev.users'不存在
我不应该在srddev数据库中查找这个表,它属于spddev,正如我在UsersTable.php中指出的那样。我如何告诉cakephp应该在不同的连接中查询这个表呢?
Ps.:两个“数据库”实际上都是同一个mysql服务器中的schemma。我试图使用默认连接和配置**$this-〉table('spddev. users')来连接到spddev. users表;**,却没有成功。

cvxl0en2

cvxl0en21#

您可以尝试将关联中的strategy设置为select。这可能会有所帮助。目前还没有对跨架构关联的完全支持。我已经在其中做了一些工作,但它不能解决所有情况。
我不确定它是在哪个CakePHP 3版本中合并的,但是我建议保持最新的发布周期。

jvlzgdj9

jvlzgdj92#

它在我的项目中工作

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

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

而且您不需要将策略设置为'select',因为这可能会造成查询限制。

相关问题