ちょっと意外?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);
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ですか。