簡體   English   中英

使用 cakephp 3 從不同的數據庫中檢索關聯的 model

[英]Retrieve associated model from different database using 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';
   }

我正在使用此表對用戶進行身份驗證,它工作正常。 但現在我想將這個 model 與我的主數據庫中的“pedidos”(訂單)model 相關聯,但它無法正常工作。 我正在我的PedidosController.php中嘗試這個:

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

但它不起作用。 我收到以下錯誤:錯誤:SQLSTATE[42S02]:未找到基表或視圖:1146 表“srddev.users”不存在

嗯,我不應該在srddev數據庫中尋找這個表,它屬於spddev ,正如我在我的 UsersTable.php 中發出的信號。 我如何告訴 cakephp 應該在不同的連接中查詢此表?

Ps.:這兩個“數據庫”其實都是同一個mysql服務器中的schemmas。 我嘗試使用默認連接和配置$this->table('spddev.users');連接到 spddev.users 表 , 但沒有成功。

您可以嘗試在關聯中設置strategyselect 這可能會有所幫助。 尚無對跨架構關聯的全面支持。 我已經做了一些工作,但並不能解決所有情況。

我不確定它是在哪個CakePHP 3版本中合並的,但是我建議您保持最新的發行周期。

它在我的項目中有效

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

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

並且不需要將策略設置為'select',因為它可能會導致查詢限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM