CakePHP3 bakeで自動生成されたTable(モデル)について。
● 使用例のテーブル定義(usersテーブル)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // ユーザーテーブル // status 0:仮登録 1:本登録 2:退会 CREATE TABLE `users` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY, `email` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, `status` char(1) DEFAULT 0, `created` DATETIME DEFAULT NULL, `modified` DATETIME DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; // テストデータ INSERT INTO `users` (`id`, `email`, `password`, `status`, `created`, `modified`) VALUES (NULL, '001@cakephp3.com', '001', '0', NULL, NULL), (NULL, '002@cakephp3.com', '002', '1', NULL, NULL); |
◯ bakeコマンド実行で作成されるTableファイル(Model/Table/UsersTable.php)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | # cat src/Model/Table/UsersTable.php <?php namespace App\Model\Table; use Cake\ORM\Query; use Cake\ORM\RulesChecker; use Cake\ORM\Table; use Cake\Validation\Validator; /** * Users Model * * @method \App\Model\Entity\User get($primaryKey, $options = []) * @method \App\Model\Entity\User newEntity($data = null, array $options = []) * @method \App\Model\Entity\User[] newEntities(array $data, array $options = []) * @method \App\Model\Entity\User|bool save(\Cake\Datasource\EntityInterface $entity, $options = []) * @method \App\Model\Entity\User patchEntity(\Cake\Datasource\EntityInterface $entity, array $data, array $options = []) * @method \App\Model\Entity\User[] patchEntities($entities, array $data, array $options = []) * @method \App\Model\Entity\User findOrCreate($search, callable $callback = null, $options = []) * * @mixin \Cake\ORM\Behavior\TimestampBehavior */ class UsersTable extends Table { /** * Initialize method * * @param array $config The configuration for the Table. * @return void */ public function initialize(array $config) { parent::initialize($config); $this->setTable('users'); $this->setDisplayField('id'); $this->setPrimaryKey('id'); $this->addBehavior('Timestamp'); } /** * Default validation rules. * * @param \Cake\Validation\Validator $validator Validator instance. * @return \Cake\Validation\Validator */ public function validationDefault(Validator $validator) { $validator ->integer('id') ->allowEmpty('id', 'create'); $validator ->email('email') ->requirePresence('email', 'create') ->notEmpty('email'); $validator ->scalar('password') ->requirePresence('password', 'create') ->notEmpty('password'); $validator ->scalar('status') ->allowEmpty('status'); return $validator; } /** * Returns a rules checker object that will be used for validating * application integrity. * * @param \Cake\ORM\RulesChecker $rules The rules object to be modified. * @return \Cake\ORM\RulesChecker */ public function buildRules(RulesChecker $rules) { $rules->add($rules->isUnique(['email'])); return $rules; } } |
◯ initialize解説
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // $this->setTable: このモデルで使用するテーブル // $this->setDisplayField: find('list')した際の結果で利用されるフィールド // $this->setPrimaryKey: 主キー設定 // $this->addBehavior('Timestamp'): // 新しくEntityを保存するときに、createdとmodifiedカラムに現在の日時を自動設定する // Entityを更新したとき、modifiedカラムに現在の日時を自動設定する public function initialize(array $config) { parent::initialize($config); $this->setTable('users'); // CakePHP 3.3以前 $this->table('users'); $this->setDisplayField('id'); // CakePHP 3.3以前 $this->displayField('id'); $this->setPrimaryKey('id'); // CakePHP 3.3以前 $this->primaryKey('id'); $this->addBehavior('Timestamp'); } |
◯ validationDefault解説
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | // integer: 整数フォーマットチェック // email: emailフォーマットチェック // allowEmpty: ブランク許可する // allowEmpty('id', 'create') // 新しくEntityを作成する際に、idカラムの空白許可する('create'でなく'update'の場合は更新時) // notEmpty: ブランク許可しない // requirePresence: フィールドの実在チェック // scalar: スカラ値フォーマットチェック ※CakePHP 3.5以降 public function validationDefault(Validator $validator) { $validator ->integer('id') ->allowEmpty('id', 'create'); $validator ->email('email') ->requirePresence('email', 'create') ->notEmpty('email'); $validator ->scalar('password') ->requirePresence('password', 'create') ->notEmpty('password'); $validator ->scalar('status') ->allowEmpty('status'); return $validator; } |
◯ buildRules解説
1 2 3 4 5 6 7 | // $rules->isUnique(['email']): emailのユニーク(一意)制約 public function buildRules(RulesChecker $rules) { $rules->add($rules->isUnique(['email'])); return $rules; } |
◯ その他よく使う$validatorオプション
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // 下記定義の場合 // range: データ値 0以上2以下 // custom: データ値 半角数字のみ // lengthBetween: データ長 1以上2以下 // maxLength: 最大データ長 2以下 // dateTime: 日付フォーマットチェック(日付と時間をスペースで連結したデータであるか検証) public function validationDefault(Validator $validator) { $validator ->range('status', [0, 2]) ->add('status', 'custom', ['rule' => ['custom', "/^[0-9]+$/"]]) ->lengthBetween('status', [1, 2]) ->maxLength('status', 1); $validator ->dateTime('created'); return $validator; } |