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
に追記してください。
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クラスを利用すると次のように表すことができます。
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にアクセスする仕組みを紹介したいと思います。