在CakePHP 3中动态添加现有表中的列

Jig*_*duk 13 php database-migration cakephp-3.0 phinx

我想在CakePHP 3中的现有表中添加列.

我的ContactsTable.php文件代码:

<?php
namespace App\Model\Table;
use Cake\ORM\Table;
use Migrations\AbstractMigration;

class ContactsTable extends Table
{
    public function initialize(array $config)
    {
        $this->addBehavior('Timestamp');
        $table = $this->table('contacts');
        $table->addColumn('price', 'decimal')->update();

    }
}
Run Code Online (Sandbox Code Playgroud)

我已经按照CakePHP 3文档中的描述尝试了但是我收到了这个错误:

在非对象上调用成员函数addColumn()

如何通过控制器即时添加列?

Kar*_*rma 6

码:

<?php

namespace App\Controller;

use Cake\Core\Configure;
use Cake\Network\Exception\NotFoundException;
use Cake\View\Exception\MissingTemplateException;
use Cake\ORM\TableRegistry;
use Cake\Database\Schema\Table;
use Cake\Datasource\ConnectionManager;
use \Migrations\AbstractMigration as AbstractMigration;
use \Phinx\Db\Adapter\MysqlAdapter as MysqlAdapter;

class PagesController extends AppController
{
    public function display()
    {
        $connectionArray = ConnectionManager::get('default')->config();
        $connectionArray['pass'] = $connectionArray['password'];
        $connectionArray['user'] = $connectionArray['username'];
        $connectionArray['name'] = $connectionArray['database'];

        $migrationObject = new AbstractMigration(mt_rand());
        $migrationObject->setAdapter(new MysqlAdapter($connectionArray));
        $tree = $migrationObject->table('tests');


        $tree->addColumn('something', 'text')
                        ->update();
    }
}
Run Code Online (Sandbox Code Playgroud)

经过几个小时的黑客攻击,终于找到了一种即时实现的方法.

测试默认cakephp 3(最新 - 截至今日 - 16年6月2日)

如果您使用的是其他数据库适配器,请将其从MysqlAdapter更改为该适配器.

用户注意事项:

  • 这是一个丑陋的黑客攻击,只有在每个迁移提交都需要对等引用的组织中不工作时才应该使用它.

  • mt_rand()绝不能用作版本号hack.

  • 没有规范的方法通过控制器这样做的.必须始终通过迁移修改数据源中的更新 - 使用适当的结构.

  • 请参阅在非shell环境中运行迁移并尝试在其下创建迁移日志/config/migrations,这些日志将更具规则特定性,并且您还将具有要查看的对等项的日志.