OSDN Git Service

Произведено изменение схемы хранения данных. Для моделей создана отдельная таблица...
[invent/invent.git] / migrations / m201103_133111_create_models_table.php
1 <?php
2
3 use yii\db\Migration;
4 use app\models\Models;
5 use app\models\Types;
6 use app\models\Items;
7
8 /**
9  * Handles the creation of table `{{%models}}`.
10  * Has foreign keys to the tables:
11  *
12  * - `{{%type}}`
13  */
14 class m201103_133111_create_models_table extends Migration
15 {
16     /**
17      * {@inheritdoc}
18      */
19     public function safeUp()
20     {
21         $table = Models::tableName();
22
23         $this->createTable($table, [
24             'id'          => 'SERIAL',
25             'name'        => $this->string()->unique()->notNull()->comment('Наименование предмета/оборудования'),
26             'type_id'     => $this->integer()->notNull()->comment('Идентификатор типа'),
27             'modelnumber' => $this->string()->comment('Номер модели'),
28             'product'     => $this->string()->comment('Код оборудования'),
29         ]);
30
31         $this->addCommentOnTable($table, 'Список наименований предметов/оборудования');
32         $this->addPrimaryKey(
33             'pk-models-id',
34             $table,
35             'id'
36         );
37
38         // Создания индекса для колонки `type_id`
39         $this->createIndex(
40             'idx-models-type_id',
41             $table,
42             'type_id'
43         );
44
45         // Добавление реляционной связи с таблицей типов `{{%type}}`
46         $this->addForeignKey(
47             'fk-models-type_id',
48             $table,
49             'type_id',
50             Types::tableName(),
51             'id',
52             'CASCADE'
53         );
54
55         // Добавление поля в таблицу предметов/оборудования
56         $itemsName = Items::tableName();
57         
58         $this->addColumn($itemsName, 'model_id', $this->integer()->comment('Идентификатор модели'));
59         // Добавление индекса для колонки 'model_id'
60         $this->createIndex(
61             'idx-items-model-id',
62             $itemsName,
63             'model_id'
64         );
65         
66         // Добавление реляционной связи с таблицей моделей '{{%models}}'
67         $this->addForeignKey(
68             'fk-items-model_id',
69             $itemsName,
70             'model_id',
71             $table,
72             'id',
73             'CASCADE'
74         );
75         
76         // Миграция записей моделей из таблицы предметов/оборудования в таблицу моделей
77         $items = Items::find()->all();
78         foreach($items as $row)
79         {
80             $model = Models::find()->where(['name' => $row->model])->all();
81             if (count($model) > 0)
82             {
83                 $this->update($itemsName, [ 'model_id' => $model[0]->id ], [ 'id' => $row->id ]);
84             }
85             else
86             {
87                 $model = new Models();
88                 $model->name = $row->model;
89                 $model->modelnumber = $row->modelnumber;
90                 $model->product = $row->product;
91                 $model->type_id = $row->type_id;
92                 if ($model->validate() && $model->save())
93                 {
94                     $this->update($itemsName, [ 'model_id' => $model->id ], [ 'id' => $row->id ]);
95                 }
96                 else
97                 {
98                     echo Yii::t('models', 'Migration: error add model: ') . print_r($model->errors(), TRUE);
99                     return FALSE;
100                 }
101             }
102         }
103         $this->alterColumn($itemsName, 'model_id', $this->integer()->notNull()->comment('Идентификатор модели'));
104         // Удаление ненужных колонок
105         $this->dropColumn($itemsName, 'model');
106         $this->dropColumn($itemsName, 'modelnumber');
107         $this->dropColumn($itemsName, 'product');
108         // Удаление связи таблиц оборудования и типов
109         $this->dropForeignKey('fk-items-types-id', $itemsName);
110         // Удаление индекса поля типов в таблице оборудования
111         $this->dropIndex('idx-items-types', $itemsName);
112         // Удаление поля типов в таблице оборудования
113         $this->dropColumn($itemsName, 'type_id');
114     }
115
116     /**
117      * {@inheritdoc}
118      */
119     public function safeDown()
120     {
121
122         echo Yii::t('app', 'Migration {migrate} can\'t reverted', ['migrate' => 'm201103_133111_create_models_table']);
123         return FALSE;
124
125         $table = Models::tableName();
126
127         // drops foreign key for table `{{%type}}`
128         $this->dropForeignKey(
129             'fk-models-type_id',
130             $table
131         );
132
133         // drops index for column `type_id`
134         $this->dropIndex(
135             'idx-models-type_id',
136             $table
137         );
138         $this->dropPrimaryKey(
139             'pk-models-id',
140             $table
141         );
142
143         $this->dropTable($table);
144     }
145 }