Динамическое добавление столбцов в существующую таблицу на лету в CakePHP 3

Я хочу добавить столбец в моей существующей таблице в 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();

}
}

Я пробовал, как описано в документации CakePHP 3, но я получил эту ошибку:

Вызов функции-члена addColumn () для необъекта

Как добавить колонки на лету через контроллер?

13

Решение

Код:

<?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();
}
}

После нескольких часов взлома, наконец-то нашел способ сделать это на лету.

Протестировано по умолчанию в CakePHP 3 (последнее — на сегодня — 2 июня ’16)

Если вы используете другой адаптер базы данных, измените его на этот адаптер из MysqlAdapter.

Примечание для пользователей:

  • Это безобразный хак и должен использоваться ТОЛЬКО, если вы не работаете в
    организация, где каждый коммит миграции требует одноранговой ссылки.

  • mt_rand () НИКОГДА не должен использоваться для взлома номера версии.

  • Есть нет канонического пути делать это через контроллеры. Обновление в источнике данных ДОЛЖНО всегда выполняться с помощью миграции — с использованием правильный состав.

  • Ссылаться на Запуск миграций в среде без оболочки и попробуйте создать журналы миграций под /config/migrations, это было бы более специфичным для правил на лету, и у вас также будут логи для просмотра равноправными узлами.

6

Другие решения

Плагин миграции также поддерживает Запуск миграций в среде без оболочки.

С момента выпуска версии 1.2 из плагина миграции вы можете запускать миграции из среды без оболочки, прямо из приложения, используя новый класс Migrations. Это может быть удобно, если вы, например, разрабатываете установщик плагинов для CMS. Класс Migrations позволяет запускать следующие команды из оболочки миграции: migrate, rollback, markMigrated, status а также seed,

У каждой из этих команд есть метод, определенный в классе Migrations.

Вы можете подготовить некоторый пользовательский обработчик, который будет принимать данные столбца со стороны пользователя и запускать миграцию. В этом случае это может быть какая-то форма с name а также type входы. Миграция будет применена к БД после отправки формы с данными.

Вот как это использовать:

use Migrations\Migrations;

$migrations = new Migrations();

// Will return an array of all migrations and their status
$status = $migrations->status();

// Will return true if success. If an error occurred, an exception will be thrown
$migrate = $migrations->migrate();

// Will return true if success. If an error occurred, an exception will be thrown
$rollback = $migrations->rollback();

// Will return true if success. If an error occurred, an exception will be thrown
$markMigrated = $migrations->markMigrated(20150804222900);

// Will return true if success. If an error occurred, an exception will be thrown
$seeded = $migrations->seed();
2

Если вы хотите добавить новый столбец в таблицу продуктов, например, «цена», а цена — «десятичная дробь», вам нужно перейти к своему проекту и написать это в консоли:

bin/cake bake migration AddPriceToProducts price:decimal

Вы можете увидеть новый файл, например Config / Перемещение / 20160501190410_AddPriceToProducts.php

<?php
use Migrations\AbstractMigration;

class AddPriceToProducts extends AbstractMigration
{
/**
* Change Method.
*
* More information on this method is available here:
* http://docs.phinx.org/en/latest/migrations.html#the-change-method
* @return void
*/
public function change()
{
$table = $this->table('products');
$table->addColumn('price', 'decimal', [
'default' => null,
...
'null' => true,
]);
$table->update();
}
}

а позже просто запустите миграцию, чтобы добавить этот столбец в базу данных, запишите это в консоли:

bin/cake migrations migrate
1
По вопросам рекламы [email protected]