首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用cakephp 3从不同数据库检索关联模型

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

Stack Overflow用户
提问于 2016-04-14 18:22:30
回答 2查看 1.8K关注 0票数 3

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

代码语言:javascript
复制
 '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中添加了一个方法,这样蛋糕就会知道这个表使用的是不同的数据库:

代码语言:javascript
复制
 public static function defaultConnectionName() {
     return 'spd';
   }

我使用这个表来验证用户,它运行得很好。但是现在我想把这个模型和我的主数据库中的"pedidos“(orders)模型联系起来,它不能正常工作。我在我的PedidosController.php里尝试这个

代码语言:javascript
复制
 public function index()
{
    $this->paginate = [
        'contain' => ['Users']
    ];
    $this->set('pedidos', $this->paginate($this->Pedidos));
    $this->set('_serialize', ['pedidos']);
}

但这不管用。我得到以下错误:错误: SQLSTATE42S02:基表或视图未找到: 1146表'srddev.users‘不存在

我不应该在srddev数据库中查找这个表,它属于spddev,因为我在UsersTable.php中发出了信号。我如何告诉cakephp这个表应该在不同的连接中被查询?

Ps.:两个“数据库”实际上是同一个mysql服务器中的架构。我试图使用默认连接和配置$this->table('spddev.users');,连接到spddev.users表,但没有成功。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-14 23:30:33

您可以尝试将关联中的strategy设置为select。这可能会有帮助。目前还没有对跨架构关联的完全支持。我已经做了一些工作,但它不能解决所有的案件。

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

票数 6
EN

Stack Overflow用户

发布于 2021-10-11 07:13:53

它在我的项目中起作用

代码语言:javascript
复制
class {YourTableNameInCamelCase}Table extends Table
{
    public function initialize(array $config)
    {
        parent::initialize($config);

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36631030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档