###前提・実現したいこと
cakePHP3にて、一つの登録フォームで複数テーブル(アソシエーション)に保存したい。
###発生している問題・エラーメッセージ
The member could not be saved. Please, try again. (Controllerの保存処理エラー)
###該当のソースコード
MemberController
public function register() { $member = $this->Member->newEntity(); if ($this->request->is('post')) { $member = $this->Member->newEntity($this->request->data, [ 'associated' => ['MemberDetail'] ]); if ($this->Member->save($member)) { $this->Flash->success(__('The member has been saved.')); return $this->redirect(['action' => 'login']); } $this->Flash->error(__('The member could not be saved. Please, try again.')); } $this->set(compact('member')); $this->set('_serialize', ['member']); }
MemberTable
class MemberTable extends Table { public function initialize(array $config) { parent::initialize($config); $this->addBehavior('Timestamp', [ 'events' => [ 'Model.beforeSave' => [ 'created_at' => 'new', 'updated_at' => 'existing', ] ] ]); $this->table('member'); $this->displayField('id'); $this->primaryKey('id'); $this->hasMany('AmusementPointHistory', [ 'foreignKey' => 'member_id' ]); $this->hasMany('MemberDetail', [ 'foreignKey' => 'member_id' ]); $this->hasMany('MemberDevice', [ 'foreignKey' => 'member_id' ]); $this->hasMany('TrophyAcquireHistory', [ 'foreignKey' => 'member_id' ]); $this->belongsToMany('Card', [ 'foreignKey' => 'member_id', 'targetForeignKey' => 'card_id', 'joinTable' => 'member_card' ]); } public function validationDefault(Validator $validator) { $validator ->allowEmpty('id', 'create'); $validator ->requirePresence('login_id', 'create') ->notEmpty('login_id') ->add('login_id', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']); $validator ->requirePresence('login_password', 'create') ->notEmpty('login_password'); $validator ->requirePresence('mail_address', 'create') ->notEmpty('mail_address') ->add('mail_address', 'unique', ['rule' => 'validateUnique', 'provider' => 'table']); $validator ->allowEmpty('remainder_hash'); $validator ->dateTime('last_login_at') ->allowEmpty('last_login_at'); $validator ->integer('is_active') ->requirePresence('is_active', 'create') ->notEmpty('is_active'); $validator ->allowEmpty('admin_memo'); $validator ->integer('is_deleted') ->requirePresence('is_deleted', 'create') ->notEmpty('is_deleted'); $validator ->allowEmpty('created_by'); $validator ->dateTime('created_at') ->requirePresence('created_at', 'create') ->notEmpty('created_at'); $validator ->allowEmpty('updated_by'); $validator ->dateTime('updated_at') ->requirePresence('updated_at', 'create') ->notEmpty('updated_at'); return $validator; } public function buildRules(RulesChecker $rules) { $rules->add($rules->isUnique(['login_id'])); $rules->add($rules->isUnique(['mail_address'])); return $rules; } public function updateLastLoginAt($user) { $data = $this->get($user['id']); $data->last_login_at = Time::now(); $this->save($data); } }
MemberDetailTable
public function initialize(array $config) { parent::initialize($config); $this->addBehavior('Timestamp', [ 'events' => [ 'Model.beforeSave' => [ 'created_at' => 'new', 'updated_at' => 'existing', ] ] ]); $this->table('member_detail'); $this->displayField('id'); $this->primaryKey('id'); $this->belongsTo('Member', [ 'foreignKey' => 'member_id', 'joinType' => 'INNER' ]); } public function validationDefault(Validator $validator) { $validator ->allowEmpty('id', 'create'); $validator ->allowEmpty('nickname'); $validator ->integer('gender') ->allowEmpty('gender'); $validator ->date('birthday') ->allowEmpty('birthday'); $validator ->integer('country') ->allowEmpty('country'); $validator ->integer('prefecture') ->allowEmpty('prefecture'); $validator ->integer('language') ->allowEmpty('language'); $validator ->allowEmpty('created_by'); $validator ->dateTime('created_at') ->requirePresence('created_at', 'create') ->notEmpty('created_at'); $validator ->allowEmpty('updated_by'); $validator ->dateTime('updated_at') ->requirePresence('updated_at', 'create') ->notEmpty('updated_at'); return $validator; } public function buildRules(RulesChecker $rules) { $rules->add($rules->existsIn(['member_id'], 'Member')); return $rules; }
register.ctp
<div class="member form large-9 medium-8 columns content"> <?= $this->Form->create($member) ?> <fieldset> <legend><?= __('新規会員登録') ?></legend> <?php echo $this->Form->input('member_detail.0.nickname'); echo $this->Form->select('member_detail.0.gender', [0, 1, 2]); echo $this->Form->input('member_detail.0.birthday', ['type' => 'date']); echo $this->Form->select('member_detail.0.country', [1, 2, 3, 4, 5]); echo $this->Form->select('member_detail.0.prefecture', [1, 2, 3, 4, 5]); echo $this->Form->select('member_detail.0.language', [1, 2, 3, 4, 5]); echo $this->Form->input('mail_address', ['type' => 'email']); echo $this->Form->hidden('login_id', ['type' => 'text']); echo $this->Form->input('login_password', ['type' => 'password']); echo $this->Form->hidden('remainder_hash'); echo $this->Form->hidden('last_login_at', ['empty' => true]); echo $this->Form->hidden('is_active'); echo $this->Form->hidden('admin_memo'); echo $this->Form->hidden('is_deleted'); echo $this->Form->hidden('created_by'); echo $this->Form->hidden('created_at'); echo $this->Form->hidden('updated_by'); echo $this->Form->hidden('updated_at'); ?> </fieldset> <?= $this->Form->button(__('Submit')) ?> <?= $this->Form->end() ?> </div>
###試したこと
Viewのバリデーションで引っかかっているのかと思い、入力させたくないフィールドを削除したのですが、変わりませんでした。
###補足情報(言語/FW/ツール等のバージョンなど)
php7.1.1 / cake PHP3.3.12/
回答1件
あなたの回答
tips
プレビュー