5
5

More than 5 years have passed since last update.

CakePHP3のHABTMのバリデーションについて

Last updated at Posted at 2016-04-22

CakePHP3のHABTMのバリデーションについて

CakePHP2までの場合

こんな感じの非常にまどろっこしい書き方をしないといけなかったですよね。

まぁ、自身のモデルでしかバリデーションはかけられないので当然と言えば当然なんですが・・・

CakePHP3について

結構なんかいい感じのやり方があるものかと思いきや特に見当たらず・・・。

取り合えず
1. CakePHP2と同じようなことをする
2. customValidationでどうにかする

しか思い当らず・・・。

とりあえず1番についてこんな方法でバリデーション自体は実現

※membersテーブルとhobbiesテーブルがhabtm関係

src/Template/Members/add.ctp

echo $this->Form->input('hobbies._ids', ['options' => $hobbies, 'required' => false]);
echo $this->Form->error('hobby');

src/Model/Table/MembersTable.php

<?php
namespace App\Model\Table;
//useは略
class MembersTable extends Table
{
    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->table('members');
        $this->displayField('name');
        $this->primaryKey('id');
        $this->addBehavior('Timestamp');

        $this->belongsToMany('Hobbies', [
            'foreignKey' => 'member_id',
            'targetForeignKey' => 'hobby_id',
            'joinTable' => 'hobbies_members'
        ]);
    }

    public function beforeMarshal(Event $event, ArrayObject $data, ArrayObject $options)
    {
        //beforeMarshalで別フィールドに値をセット
        //(ちゃんとエラーチェックとかしたほうがいいけど一旦無視
        $event->data['data']['hobby'] = $event->data['data']['hobbies']['_ids'];
    }

    public function validationDefault(Validator $validator)
    {
        $validator
            ->add('hobby', ['multiple' => [
                'rule' => ['multiple', ['min' => 1]],
                'message' => 'hogehoge'
            ]]);
        return $validator;
    }
}

まとめ

なんかもっとスマートない方法ないんですかね?

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5