cakephp - 将表与另一个数据库

时间:2017-09-15 18:27:54

标签: php mysql cakephp

我的数据库中有一个“资产”表(id,name,serial),以及一个存储在外部数据库中的只读表ASSET(大写)(ID,NAME,SERIAL)(在app中声明)。 PHP)

在我的app.php中,我把连接:

'Datasources' => [
    'default' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'username' => 'root',
        'password' => '',
        'database' => 'db1',
        'encoding' => 'utf8',
        'quoteIdentifiers' => false,
        'url' => env('DATABASE_URL', null),
    ],

    'external_db' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'domain.com',
        'port' => '3306',
        'username' => 'my_user',
        'password' => 'my_password',
        'database' => 'db2',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'flags' => [],
        'cacheMetadata' => false,
        'quoteIdentifiers' => false,
        'log' => false,
        'url' => env('DATABASE_URL', null),
    ],

我能够:蛋糕烘焙所有资产(来自默认数据库)。 由于蛋糕烘烤不支持大写,我手动创建: ExternalAssetsTable.php:

class ExternalAssetsTable extends Table {

public function initialize(array $config)
{
    parent::initialize($config);
    $this->ExternalAsset->setDataSource('external_db');
    $this->setTable('ASSET');
    $this->setDisplayField('NAME');
    $this->setPrimaryKey('ID');

然后,我尝试使用:

创建控制器和模板视图
cake bake controller external_assets
cake bake template external_assets

并且:     蛋糕烘焙控制器ASSET -c external_db     蛋糕烘焙模板ASSET -c external_db

并且代码无效。

我的第一个问题:我的代码出了什么问题?

我的第二个需求如下:

“assets”包含从ASSET导入的数据,以及在我的数据库中手动输入的其他数据。

SERIAL可能会偶尔更改,我需要将其导入资产。所以foreach name = NAME,如果序列<> SERIAL然后连续:= SERIAL。

在资产index.ctp和view.ctp中,我需要显示以下列:id,name,serial,以及相应的ASSET.NAME,ASSET.SERIAL(如果存在)。

我尝试在AssetsController.php中添加一个函数

public function getRemoteData(){
  $conn1 = ConnectionManager::get('k1000db'); #Remote Database 1
  $sql   = "SELECT * FROM  ASSET";
  $query = $conn1->prepare($sql);
  $query->execute();
  $result = $query->fetchAll(); #Here is the result
}

我的问题是:如何在AssetsController index(),view()函数和Assets中调用此函数index.ctp?

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

在第一个问题中:

<video width="400" controls> <source src="https://www.w3schools.com/html/mov_bbb.mp4" type="video/mp4"> </video> <video width="400" controls> <source src="https://www.w3schools.com/html/mov_bbb.mp4" type="video/mp4"> </video> <video width="400" controls> <source src="https://www.w3schools.com/html/mov_bbb.mp4" type="video/mp4"> </video>根据您在数据库中的表格制作所有内容,因此,您的代码是:

cake bake

如果使用上面的代码,请检查Cakephp可以cake bake ASSETS -c your_external_db_here 的所有表格:

bake

完成后,请手动将cake bake -c your_external_db_here 重命名为ASSETSExternalAssetsController和其他Template folder以更好地识别表格。但请注意,baked并不能替换您之前烘焙的其他cake bake

在第二个问题中:

您将在AssetTable中创建assets

Association

在您的控制器中:

public function initialize(array $config)
    {
        parent::initialize($config);

        $this->hasOne('ExternalAssets')->setForeignKey('fk_here')->('pk_here');
    }

答案 1 :(得分:0)

我不可能用蛋糕烘烤外部表,因为它不遵守cakephp约定。因此,我可以在index()中使用它:

    $connection = ConnectionManager::get('db2');
    $machines = $connection->execute('SELECT * FROM MACHINE ORDER BY NAME ASC');
    $this->set(compact('machines'));
    $this->set('_serialize', ['machines']);

然后,我手动创建视图。