使用2个数据库的CakePHP 3.x JOIN查询

时间:2018-02-28 14:25:21

标签: cakephp cakephp-3.0

我在CakePHP 3.4.6中有一个应用程序。它与3个遗留数据库进行交互 - 即根据CakePHP命名约定未编写的数据库。

我已在config/app.php中配置了与这些数据库的连接:

'Datasources' => [
    'default' => [
        'host' => 'localhost',
        'username' => '',
        'password' => '',
        'database' => 'substances_db'
    ],
    'org_data' => [
        'host' => 'localhost',
        'username' => '',
        'password' => '',
        'database' => 'organisation_data_db'
    ],
    ...
]

我需要能够编写一个从“默认”数据库(substances_db)中选择数据的查询,并使用“org_db”数据库中的数据执行JOINorganisation_data_db )。

我没有将Cake的ORM用于应用程序的任何部分,因为有太多的表与Cake的约定相反。

我做事的方式是根据Cake Database Basics - Executing Queries的文档。

例如,在src/Model/SubstanceModel.php中,我获得了与每个数据库的连接,因此我可以在我的模型中使用它们:

namespace App\Model;

use Cake\Datasource\ConnectionManager;

class SubstanceModel
{

    protected $db_default;
    protected $db_orgs;

    public function __construct()
    {
        $this->db_default = ConnectionManager::get('default');
        $this->db_orgs = ConnectionManager::get('org_data');
    }
 }

这意味着我可以在模型函数中编写查询,例如

public function getTotalSubstances()
{ 
    // Executes query on "default" database ('substances_db')

    $results = $this->db_default->execute('SELECT COUNT(DISTINCT(id)) AS total_substances FROM substances')->fetch('assoc');
    return (int)$results['total_substances'];
} 

所有这一切都很好。

但我现在需要编写一个查询,JOINorganisation_data_db中的某些表执行SELECT * FROM substances_db.table1 JOIN organisation_data_db.table2 ...

我不知道该怎么做。 MySQL等价物是您将数据库名称作为查询中的表格的前缀,例如

SET OutputLocalEnvironment.WrittenDestination.File.Name = $yourfilename;

这是否可以在CakePHP 3.x中使用?

0 个答案:

没有答案