CakePHPでHABTMのデータのチェックボックスを作る

  • このエントリーをはてなブックマークに追加

前提

前提として以下のような場合のテーブルでHABTMの設定をしているとします。

テーブルのリレーション

モデル

good.php

<?php
class Good extends AppModel {
    var $name = 'Good';
    var $hasAndBelongsToMany = array(
        'Tag' => array(
            'className'             => 'Tag',
            'joinTable'             => 'goods_has_tags',
            'with'                  => 'GoodsHasTag',
            'foreignKey'            => 'good_id',
            'associationForeignKey' => 'tag_id',
            'conditions'            => array(
                'Tag.deleted' => null,
            ),
            'unique'                => true,
        )
    );

    var $validate = array(
        'id'          => array('notempty'),
    );

}
?>

tag.php

<?php
class Tag extends AppModel {
    var $name = 'Tag';
    var $hasAndBelongsToMany = array(
        'Good' => array(
            'className'             => 'Good',
            'joinTable'             => 'goods_has_tags',
            'with'                  => 'GoodsHasTag',
            'foreignKey'            => 'tag_id',
            'associationForeignKey' => 'good_id',
            'conditions'            => array(
                'Good.deleted' => null,
            ),
            'unique'                => true,
        )
    );
    var $hasMany = array(
        'GoodsHasTag' => array(
            'className'  => 'GoodsHasTag',
            'foreignKey' => 'tag_id',
        )
    );

    var $validate = array(
        'id' => array('notempty'),
    );

}
?>

goods_has_tag.php

<?php
class GoodsHasTag extends AppModel {

    var $name = 'GoodsHasTag';

    var $belongsTo = array(
        'Good'           => array(
            'className'  => 'Good',
            'foreignKey' => 'good_id',
            'conditions'            => array(
                'Good.deleted' => null,
            ),
            'unique'                => true,
            'fields'     => '',
            'order'      => ''
        ),
        'Tag' => array(
            'className'  => 'Tag',
            'foreignKey' => 'tag_id',
            'conditions'            => array(
                'tag.deleted' => null,
            ),
            'unique'                => true,
            'fields'     => '',
            'order'      => ''
        )
    );

}
?>

※deletedは削除用フラグ

チェックボックス作成用のソースコード

コントローラー

function add(){
        $this->set('tags', $this->Good->Tag->find('list', array(
            'conditions' => array(
                'Tag.deleted' => null,
            ))));
    ...
}

ビュー

<?php
echo $form->input('Tag',array('multiple'=>'checkbox', 'label' => 'タグ'));
?>

このように書いておけば、例えば更新画面の場合は$this->dataに入ってるデータをデフォルトでチェックつけた状態で表示されますし。登録の際に$this->Good->saveAll($this->data);とすればgoods_has_tagsテーブルも更新されます。(更新の場合はDELETE、INSERTされます)

個人的にはHABTMでデータ持つのは面倒な気がしていてあまり好きじゃないので、多対多の場合はカンマ区切りで文字列でデータを持たせるように作ってます。
(goodsの場合だと、goods.tagのようなフィールドを作って文字列で)

文字列で持たせる場合も、以下のコードでチェックボックスを作成できます。

<?php
echo $form->input('tag', array('type' => 'select', 'multiple' => 'checkbox', 'options' => Invariable::$TAG_TYPES, 'value' => explode(',', $this->data['Good']['tag']), 'label' => 'タグ'));
?>

※タグは定数Invariable::$TAG_TYPESで管理。

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

ads

コメントを残す

*