CodeIgniter4のModelまわりを見ていきます。
ORM対応などで3の頃とは様相が変わった気がしますが、どんな感じなのでしょうか。
詳細な部分は、公式ガイドも参照頂けると。
DB接続について
Modelの記述の前に簡単にデータベース接続に関して触れておきます。
設定は.envかapp/Config配下のDatabase.phpで行えます。
優先順位としては.envの記述がDatabase.phpより優先されるので、
環境構築の際はその辺りの考慮も必要ですね。
Database.phpの場合は以下のような感じです。
/**
* The default database connection.
*
* @var array
*/
public $default = [
'DSN' => '',
'hostname' => 'localhost',
'username' => 'root',
'password' => 'adP4!s7jbdQfd',
'database' => 'ci4',
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => 'utf8',
'DBCollat' => 'utf8_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => 3306,
];
この辺りはCodeIgniter3と大きくは変わらない印象です。
Modelを作成してみる
せっかくなのでsparkコマンドから作成してみます。
# php spark make:model User --suffix
File created: APPPATH/Models/UserModel.php
以下のようなファイルが生成されます。
<?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;
protected $allowedFields = [];
// 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 = [];
}
$allowedFieldsを埋めてテスト用のデータを入れてみます。
protected $allowedFields = ['name','email','ip_address','department_id'];
標準でFakerが使えるので、以下のように使ってみました。
<?php
namespace App\Database\Seeds;
use CodeIgniter\Database\Seeder;
use Faker\Factory;
class UserSeeder extends Seeder{
public function run(){
$model = model('UserModel');
$faker = Factory::create();
for($i = 1; $i <= 10; $i++) {
$model->insert([
'name' => $faker->lastName,
'email' => $faker->email,
'ip_address' => $faker->ipv4,
'department_id' => $faker->numberBetween(1,4),
]);
}
}
}
# php spark db:seed UserSeeder
Seeded: App\Database\Seeds\UserSeeder
mysql> SELECT * FROM users;
+----+----------+---------------------------+-----------------+---------------+
| id | name | email | ip_address | department_id |
+----+----------+---------------------------+-----------------+---------------+
| 1 | Wolff | silas.herman@gmail.com | 83.188.2.245 | 2 |
| 2 | Hill | okrajcik@yahoo.com | 88.147.33.119 | 2 |
| 3 | Tromp | istehr@reynolds.com | 211.126.235.217 | 3 |
| 4 | Conn | cremin.benton@okeefe.org | 102.86.22.148 | 4 |
| 5 | Kemmer | king.lourdes@prohaska.org | 88.55.96.44 | 1 |
| 6 | Leffler | tyson23@yahoo.com | 76.150.9.125 | 2 |
| 7 | Champlin | jerod09@swaniawski.com | 169.8.234.67 | 4 |
| 8 | Hickle | thiel.kory@gmail.com | 159.189.110.114 | 3 |
| 9 | Wehner | duane28@gmail.com | 32.1.86.10 | 2 |
| 10 | Sporer | dibbert.dante@mohr.com | 73.91.204.189 | 3 |
+----+----------+---------------------------+-----------------+---------------+
上記のテーブルをベースにモデルを利用してみます。
コントローラは以下のような感じです。
<?php
namespace App\Controllers;
use App\Controllers\BaseController;
use App\Models\UserModel;
class User extends BaseController{
public function index(){
$userModel = new UserModel();
}
}
ちなみにモデルの呼び出しは別の書き方もできます。
$userModel = model('App\Models\UserModel');
// useで取り込んである場合パスは省略可
$userModel = model('UserModel');
この辺りの詳細はドキュメントをご確認下さい。
基礎的なCRUDに対応する関数
公式ではORMという表現は見られないです。
あくまで簡易なCRUD作業を手助けするための関数という位置づけのようです。
データを見つける
find()
$user = $userModel->find(3);
//dump結果
array(5) {
["id"]=>
string(1) "3"
["name"]=>
string(5) "Tromp"
["email"]=>
string(19) "istehr@reynolds.com"
["ip_address"]=>
string(15) "211.126.235.217"
["department_id"]=>
string(1) "3"
}
プライマリーキーに基づいて取得できます。
複数行取得する場合は以下のような感じです。
$users = $userModel->find([1,2,3]);
findAll()
$users = $userModel->findAll();
対象のテーブルから全件取得できます。
以下のようにwhereなどと組み合わせて利用することもできます。
$users = $userModel->where('department_id', 2)->findAll();
array(2) {
[0]=>
array(5) {
["id"]=>
string(1) "4"
["name"]=>
string(4) "Conn"
["email"]=>
string(24) "cremin.benton@okeefe.org"
["ip_address"]=>
string(13) "102.86.22.148"
["department_id"]=>
string(1) "4"
}
[1]=>
array(5) {
["id"]=>
string(1) "7"
["name"]=>
string(8) "Champlin"
["email"]=>
string(22) "jerod09@swaniawski.com"
["ip_address"]=>
string(12) "169.8.234.67"
["department_id"]=>
string(1) "4"
}
}
データを保存する
insert()
$data = [
'name' => 'test',
'email' => 'dsdsdsder@thsdgdfgre.com'
];
$userModel->insert($data);
Modelで$allowedFieldsに記載されていない場合エラーになります。
update()
$id = 11;
$data = [
'name' => 'hoge',
'ip_address' => '164.81.234.69',
'department_id' => 4
];
$userModel->update($id, $data);
第一引数にプライマリーキーの指定が必要です。
save()
$data = [
'id' => 11,
'name' => 'fuga',
'ip_address' => '164.81.234.66',
'department_id' => 4
];
$userModel->save($data);
プライマリーキーが見つかればupdate、
見つからなければinsertになります。
データを削除する
delete()
$userModel->delete(11);
削除もプライマリーキーの指定のみで行うことができます。
下記のように複数指定やWHEREとの組み合わせも可能です。
$userModel->delete([1,2,3]);
$userModel->where('id', 12)->delete();
まとめ
上記のメソッドを利用するとかなりシンプルに記述できそうです。
複雑なアプリケーションでなければ使えそうかなと思いますが、
クエリビルダと組み合わせていくとなると書き方のバラつきは出そうですね。