LoginSignup
2
1

More than 3 years have passed since last update.

CodeIgniter4でMySQLのDB構築

Last updated at Posted at 2020-05-08

DB接続まではこちらをご覧ください。

DBを作る前に一言

前回の記事でもそうなのですが、本来はDBの操作はModelsの中で行うべきなのですが(というより、コントローラ内で、モデルとビューの操作以外を行うことがよろしくない)、CIはこのあたりの縛りが非常にゆるくなっています。
今回もMVCモデルがイマイチ判らん!という人にも直感的に理解できるように、あえてコントローラの中でプログラムを完結させていきたいと思います。
このあと、このメソッドをちゃんとModelに持っていく記事も書く予定です。

2020/05/14 追記:書きました

とにかくDBを作る

CI4のDB自体やテーブルの作成などはDatabase Forgeクラスが利用可能です。
ただ、.envファイルに使用したいDB名が記述されている場合はForgeを初期化する時にそのDBに接続しにいってしまい、DBがまだできていない状態ではエラーになってしまいます。
これを回避するためにDBを生成する際はForgeの初期化の際にDB名を空にしたパラメータを送ってやる必要があります。

具体的には次のメソッドをHome.phpに追記してください。

Home.phpに追記するDB生成のメソッド
    public function createNewDB(){
        $conf = [
            'hostname' => $_ENV['database.default.hostname'] ,
            'username' => $_ENV['database.default.username'] ,
            'password' => $_ENV['database.default.password'] ,
            'DBDriver' => $_ENV['database.default.DBDriver'] ,
            'charset'  => $_ENV['database.default.charset'] ,
            'DBCollat' => $_ENV['database.default.DBCollat'] ,
        ];
        $forge = Database::Forge( $conf );
        $forge->createDatabase( $_ENV['database.default.database'] , true );
        echo "DB生成成功";
        return;
    }

$confにはホスト名、ユーザ名、パスワード、使用するDBドライバ、に加えmysqlの場合は文字コードや参照順序など(つまり、.envで設定したDB名以外の全部のDBパラメータ)を記述した上で、Forgeクラスを呼びます。

実際のDB作成の実行はcreateDatabaseメソッドで行います。
第1引数には、データベース名を入力します。上記の例では.envのDB名を入力しています。
第2引数をtrueにすると実行するSQLにIF NOT EXISTSが付く形になります。つまりDBがすでに存在する場合にもエラーになりません。

ここへのアクセスはhttp://example.com/Home/createNewDB/になります。

エラーをキャッチしたい

CI4はエラー時には例外を発生させます。つまりこれはtry〜catchでかんたんにエラー処理ができるということです。

例外処理の例
    public function createNewDB(){
        try{
            $conf = [
                'hostname' => $_ENV['database.default.hostname'] ,
                'database' => '' ,
                'username' => $_ENV['database.default.username'] ,
                'password' => $_ENV['database.default.password'] ,
                'DBDriver' => $_ENV['database.default.DBDriver'] ,
                'charset'  => $_ENV['database.default.charset'] ,
                'DBCollat' => $_ENV['database.default.DBCollat'] ,
            ];
            $forge = Database::Forge( $conf );
            $forge->createDatabase( $_ENV['database.default.database'] );
            echo "DB生成成功";
        }catch( \Exception $e ){
            echo "DB生成失敗 原因=" . $e->getMessage();
        }
        return;
    }

テーブルを作る

次にテーブルを作ってみます。テーブルの生成もForgeクラスが利用可能です。
ここでは次のようなスキーマを生成する場合の例を取り上げます。

生成したいテーブルのスキーマ
CREATE TABLE `users` (
  `id` int UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `login_id` varchar(100) NOT NULL UNIQUE,
  `login_pw` varchar(100) NOT NULL
) DEFAULT CHARSET=utf8mb4;

これはForgeクラスを利用すると次のように表すことができます。

Home.phpに追記するテーブルの生成メソッド
    public function createNewTable(){
        try{
            $forge  = Database::Forge();
            $fields = [
                'id'       => [
                    'type'           => 'INT' ,
                    'unsigned'       => true ,
                    'auto_increment' => true ,
                ] ,
                'login_id' => [
                    'type'       => 'VARCHAR' ,
                    'constraint' => 100 ,
                    'null'       => false ,
                    'unique'     => true ,
                ] ,
                'login_pw' => [
                    'type'       => 'VARCHAR' ,
                    'constraint' => 100 ,
                    'null'       => false ,
                ] ,
            ];
            $forge->addField( $fields );
            $forge->addPrimaryKey( 'id' );
            $forge->createTable( 'users' , true );
            echo "Table生成成功";
        }catch( \Exception $e ){
            echo "Table生成失敗 原因=" . $e->getMessage();
        }
        return;
    }

$fieldsに配列の形で追加したいカラム名や属性や制約を記述しておき、addFieldメソッドとaddPrimaryKeyメソッドでカラム設定とPKEYの設定を行い、createTableで実際にテーブルの生成を行うという流れです。

ここへのアクセスはhttp://example.com/Home/createNewTable/になります。

なお、Forgeクラスにはどんなメソッドが用意されているか詳しく知りたい方は、ユーザーガイドが参考になります。

次の記事では実際にModelsを利用してDBにアクセスする仕組みを紹介したいと思います。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1