когда я впервые сделал файл миграции для таблицы users
, public function down()
в файле миграции был пуст. когда я запускаю php spark migrate
таблица users
была создана.
затем я создал еще один файл миграции с помощью php spark make:migration users
, сделал несколько корректировок в соответствии с новой структурой таблицы и поместил $this->forge->dropTable('users');
в public function down()
. но когда я снова запускаю php spark migrate
, в таблице users
нет нового поля..
Я использую codeigniter 4 и mysql. вот мой код
UserModelphp
<?php
namespace App\Models;
use CodeIgniter\Model;
class UserModel extends Model
{
protected $DBGroup = 'default';
protected $table = 'users';
protected $primaryKey = 'id';
protected $useAutoIncrement = true;
protected $insertID = 0;
protected $returnType = 'array';
protected $useSoftDeletes = false;
protected $protectFields = true;
// added created_at and updated_at
protected $allowedFields = ['username', 'password', 'foto', 'nama', 'email', 'telepon', 'created_at', 'updated_at'];
// Dates
protected $useTimestamps = false;
protected $dateFormat = 'datetime';
protected $createdField = 'created_at';
protected $updatedField = 'updated_at';
protected $deletedField = 'deleted_at';
// Validation
protected $validationRules = [];
protected $validationMessages = [];
protected $skipValidation = false;
protected $cleanValidationRules = true;
// Callbacks
protected $allowCallbacks = true;
protected $beforeInsert = [];
protected $afterInsert = [];
protected $beforeUpdate = [];
protected $afterUpdate = [];
protected $beforeFind = [];
protected $afterFind = [];
protected $beforeDelete = [];
protected $afterDelete = [];
}
первый файл миграции
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class Users extends Migration
{
public function up()
{
// tabel users
$this->forge->addField([
'id' => [
'type' => 'INT',
'constraint' => 7,
'auto_increment' => true,
],
'username' => [
'type' => 'VARCHAR',
'constraint' => 50,
'null' => false,
],
'password' => [
'type' => 'VARCHAR',
'constraint' => 255,
'null' => false,
],
'profile_pic' => [
'type' => 'VARCHAR',
'constraint' => 50,
],
'nama' => [
'type' => 'VARCHAR',
'constraint' => 50,
],
'email' => [
'type' => 'VARCHAR',
'constraint' => 100,
],
'telepon' => [
'type' => 'VARCHAR',
'constraint' => 10,
],
]);
$this->forge->addKey('id', true);
$this->forge->createTable('users');
}
public function down()
{
// hapus tabel users
}
}
новый файл миграции
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class Users extends Migration
{
public function up()
{
// tabel users
$this->forge->addField([
'id' => [
'type' => 'INT',
'constraint' => 7,
'auto_increment' => true,
],
'username' => [
'type' => 'VARCHAR',
'constraint' => 50,
'null' => false,
],
'password' => [
'type' => 'VARCHAR',
'constraint' => 255,
'null' => false,
],
'foto' => [
'type' => 'VARCHAR',
'constraint' => 50,
],
'nama' => [
'type' => 'VARCHAR',
'constraint' => 50,
],
'email' => [
'type' => 'VARCHAR',
'constraint' => 100,
],
'telepon' => [
'type' => 'VARCHAR',
'constraint' => 10,
],
'created_at DATETIME DEFAULT CURRENT_TIMESTAMP',
'updated_at DATETIME DEFAULT CURRENT_TIMESTAMP',
]);
$this->forge->addKey('id', true);
$this->forge->createTable('users');
}
public function down()
{
// hapus tabel users
$this->forge->dropTable('users');
}
}
может кто-нибудь сказать мне, что я делаю неправильно? любая помощь приветствуется
Метод down()
не вызывается при выполнении php spark migrate
.
Метод down()
запускается, когда вы выполняете процесс отката миграции с помощью php spark migrate:rollback
.
Добавьте строку кода $this->forge->dropTable('users');
в начало метода up()
«нового файла миграции».
новый файл миграции
// ...
class Users extends Migration
{
public function up()
{
$this->forge->dropTable('users');
// ...
}
// ....
}
Цель метода down()
— «обратить» все, что выполняется в методе up()
.
Учитывая, что в вашей новой миграции вы только переименовываете существующий столбец таблицы (profile_pic
-> foto
) и добавляете столбцы временных меток, было бы разумнее указать более значимое «имя миграции».
Кроме того, вместо того, чтобы удалять и воссоздавать существующую таблицу, измените ее. То есть:
новый файл миграции
A. Команда (Создать новую миграцию):
php spark make:migration alter_users_rename_profile_pic_add_timestamps
B. Сгенерированная миграция.
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class AlterUsersRenameProfilePicAddTimestamps extends Migration
{
private $tableName = "users";
public function up()
{
$this->forge->modifyColumn($this->tableName, [
"profile_pic" => [
'name' => 'foto',
'type' => 'VARCHAR',
'constraint' => 50,
]
]);
$this->forge->addColumn($this->tableName, [
'created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP',
'updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP',
]);
}
public function down()
{
$this->forge->modifyColumn($this->tableName, [
"foto" => [
'name' => 'profile_pic',
'type' => 'VARCHAR',
'constraint' => 50,
]
]);
$this->forge->dropColumn($this->tableName, ["created_at", "updated_at"]);
}
}
@dapidmini Добро пожаловать. Да, раздел "Дополнительные примечания" был добавлен позже. Извините за это!? Если я вас правильно понял, когда вы говорите "пространство имен миграции", вы на самом деле имеете в виду "имя файла миграции"?
да, я имел в виду "имя файла миграции".
спасибо! Я не видел часть дополнительных примечаний в вашем ответе ... вы добавили это позже? в любом случае, некоторые люди говорят, что мы должны использовать управление версиями в пространстве имен миграции, например
001_create_tblname
илиYYYYMMDDHHiiss_create_tblname
... что бы вы посоветовали?