Файл миграции codeigniter 4 не создает таблицу

когда я впервые сделал файл миграции для таблицы 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');
    }
}

может кто-нибудь сказать мне, что я делаю неправильно? любая помощь приветствуется

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Объяснение:

Метод 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"]);

    }
}

спасибо! Я не видел часть дополнительных примечаний в вашем ответе ... вы добавили это позже? в любом случае, некоторые люди говорят, что мы должны использовать управление версиями в пространстве имен миграции, например 001_create_tblname или YYYYMMDDHHiiss_create_tblname... что бы вы посоветовали?

dapidmini 27.03.2022 18:31

@dapidmini Добро пожаловать. Да, раздел "Дополнительные примечания" был добавлен позже. Извините за это!? Если я вас правильно понял, когда вы говорите "пространство имен миграции", вы на самом деле имеете в виду "имя файла миграции"?

steven7mwesigwa 27.03.2022 18:55

да, я имел в виду "имя файла миграции".

dapidmini 27.03.2022 19:00

Другие вопросы по теме