7. class m170506_185632_createUser extends Migration {
public function up() {
$this->createTable(‘User’, []);
}
public function down() {
echo "m???_createUser cannot be reverted.n";
return false;
}
class m170506_185632_createUser extends Migration {
public function up() {
$this->createTable(‘User’, []);
}
public function down() {
$this->dropTable(‘User’);
}
8. История PHP и история БД
t
“Dev” “Production”
A
B
C
1
2
3
4
5
6
PHP DB
A
B
C
1
2
3
4
5
6
PHP DB
9. class m141106_185632_log_init extends Migration {
public function up() {
foreach (Yii::$app->getLog()->targets as $target) {
if ($target instanceof DbTarget) {
$this->createTable($target->logTable, […]);
}
}
}
class m141106_185632_log_init extends Migration {
public function up() {
$columns = […];
$this->createTable(‘AppLog’, $columns);
$this->createTable(‘ErrorLog’, $columns);
}
10. use appmodelsUser;
class m141106_185632_updateUser extends Migration {
public function up() {
User::updateAll([‘statusId’ => 5], [‘statusId’ => 10]);
}
public function down() {
foreach (User::find()->where([‘statusId’ => 10])->all() as $user) {
$user->statusId = 5;
}
}
class m141106_185632_updateUser extends Migration {
public function up() {
$this->update(‘User’, [‘statusId’ => 5], [‘statusId’ => 10]);
}
}
11. class m141106_185632_createFaqCategory extends Migration {
public function up() {
$this->createTable(‘FaqCategory’, […]);
}
}
class m141106_185632_createFaqQuestion extends Migration {
public function up() {
$this->createTable(‘FaqQuestion’, […]);
}
}
class m141106_185632_createFaq extends Migration {
public function up() {
$this->createTable(‘FaqCategory’, […]);
$this->createTable(‘FaqQuestion’, […]);
}
}
12. «Инсталляция» расширения / модуля
$ composer require/update
Применение на уровне PHP
(конфигурация
компонентов и модулей)
Применение на уровне БД
(создание миграции БД)
Миграция БД
$ php yii migrate/up
13. Применение миграций из нескольких
источников
“some/extension”“My Project”
m170501_A
m170502_B
m170504_C
m150501_External
15. История на сервере разработки
m170501_A
m170502_B
m170504_C
m150501_External
t
Расширение
подключено
03-05-17
“My Project” “some/extension”
“Зависит от”
16. История на «production» сервере
m170501_A
m170502_B
m170504_C
m150501_External
t
“some/extension”
“Зависит от”
migrationPath=some/extension/migrations
migrationPath=app/migrations
“My Project”
17. История на «production» сервере
m170501_A
m170502_B
m170504_C
m150501_External
t
С «нуля» миграции
применяются в
хронологическом порядке
“My Project” “some/extension”
“Зависит от”
23. Наследование
// Без пространства имен:
require (Yii::getAlias(‘@some/extension/
m160201_132117_someExtensionMigration.php’));
class m170505_142134_applySomeExtension extends
m160201_132117_someExtensionMigration {}
// С пространством имен:
namespace appmigrations;
class M170505142134ApplySomeExtension extends
someextensionmigrationsM160201132117SomeExtensionMigration {}
28. Агрегация с пространством имен
namespace appmigrations;
use someextensionM160201132117A.php’;
use anotherextensionM150301141133B.php;
class M170505142134Aggregation extends yiidbMigration
{
public function up()
{
(new M160201132117A([‘db’ => $this->db]))->up();
(new M150301141133B([‘db’ => $this->db]))->up();
}
public function down()
{
(new M150301141133B([‘db’ => $this->db]))->down();
(new M160201132117A([‘db’ => $this->db]))->down();
}
}
30. Независимое использование
миграций
use myextensionM170505142134Foo;
class InstallController extends yiiconsoleController
{
public function actionInstall()
{
(new M170505142134Foo([‘db’ => Yii::$app->db]))->up();
}
public function actionUninstall()
{
(new M170505142134Foo([‘db’ => Yii::$app->db]))->down();
}
}
31. Миграции в модульных тестах
class BlogPostTest extends TestCase
{
protected function setUp()
{
$this->mockApplication();
Yii::$app->db->beginTransaction();
(new M170505142134Foo([‘db’ => Yii::$app->db]))->safeUp();
}
protected function tearDown()
{
Yii::$app->db->getTransaction()->rollback();
}
// …
}
32. Миграции и Инсталляции
• Инсталляция, обновление, откат
рабочей копии проекта
• Миграции – VCS для БД
• Типичные ошибки
• Применение миграций из нескольких
источников
• Независимое использование миграций
http://www.yiiframework.com/