ちょっと意外?Cakephpは同一のテーブルでbindできる ITかあさん

ITかあさん

ちょっと意外?Cakephpは同一のテーブルでbindできる

Cakephpは同一のテーブルでbindできる

まさか~と思って試したところ、出来てしまいました。
一つのテーブルに、親子関係があるようなデータ構造があったとします。
例えば都道府県と市区町村を一つのテーブルで管理するareaテーブルがあったとします。

areaテーブルの例

下記の場合だと、都道府県が親、市区町村が子の関係になり、都道府県は親を持たないデータ、市区町村はそれぞれの都道府県を親に持つデータ構造になります。
この場合、子を複数持つ、hasManyの形で『たった一つのテーブルでbind』したいのです。

areaテーブルのデータの例

id name parent_id
1 東京 0
2 埼玉 0
3 千葉 0
4 神奈川 0
5 栃木 0
6 新宿 1
7 さいたま市 2
8 浦安 3
9 横浜 4
10 宇都宮 5

Cakephp hasManyでbind

親(都道府県)が、子(市区町村)をたくさん持つのですから、この場合hasManyですね。

$this->Area->bindModel(
array(
hasMany‘=>array(
Area‘=>array(
‘className’=>’Area‘,
‘conditions’=>”,
‘order’=>”,
‘foreignKey’=>’parent_id’,
)
)
),false);

hasMany bindの実行結果

実行結果は以下のようになり、単一のテーブルでも何ら問題ないhasManyで結果が返ってきます。

Array
(
    [0] => Array
        (
            [Area] => Array
                (
                    [id] => 1
                    [name] => 東京
                    [parent_id] => 0
                    [0] => Array
                        (
                            [id] => 6
                            [name] => 新宿
                            [parent_id] => 1
                        )

                )

        )
    [1] => Array
        (
            [Area] => Array
                (
                    [id] => 2
                    [name] => 埼玉
                    [parent_id] => 0
                    [0] => Array
                        (
                            [id] => 7
                            [name] => さいたま市
                            [parent_id] => 2
                        )

                )

        )
)

単一のテーブルでhasManyのSQL

bindは単一のテーブルでも可能なことは分かりました。
最後にどのようなSQLが発行されていたか確認しました。

SELECT `Area`.`id`, `Area`.`name`, `Area`.`parent_id` FROM `areas` AS `Area` WHERE `Area`.`parent_id` IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

なるほど、INですか。

初夏のJavaScript祭 in サーキュレーションビル ForPro