CodeIgniter4でMySQLのDB構築

DB接続までは[こちら](https://qiita.com/kohenji01/items/ced458da42ce70e067f8)をご覧ください。

#DBを作る前に一言

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

2020/05/14 追記：[書きました](https://qiita.com/kohenji01/items/b3e947623309d478e02b)

#とにかくDBを作る

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

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

```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引数を`ｔｒｕｅ`にすると実行するSQLに`IF NOT EXISTS`が付く形になります。つまりDBがすでに存在する場合にもエラーになりません。

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

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



```php:例外処理の例
    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クラスが利用可能です。
ここでは次のようなスキーマを生成する場合の例を取り上げます。

```sql:生成したいテーブルのスキーマ
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クラスを利用すると次のように表すことができます。

```php: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クラスにはどんなメソッドが用意されているか詳しく知りたい方は、[ユーザーガイド](https://codeigniter4.github.io/userguide/dbmgmt/forge.html)が参考になります。

[次の記事](https://qiita.com/kohenji01/items/b3e947623309d478e02b)では実際に`Models`を利用してDBにアクセスする仕組みを紹介したいと思います。