私は、PHP/MySQLのクロージャーテーブルを使って、Codeigniterを使用しています。私が開発しているアプリケーションでは、領域があり、各領域には場所、部署などPHP/MySQLでクロージャーテーブルに挿入する
私はhttp://www.slideshare.net/billkarwin/models-for-hierarchical-dataを使ってどのように動作するかを知っています。
また、私はデータにアクセスするのに役立つためにhttps://gist.github.com/dazld/2174233を使用しています。私はそれを行うことができます。データを必要に応じて取り出す方法を変更しました。
今はデータを挿入しようとしていますが、私はその周りに頭を浮かべることができません。だから私は、上記のスクリプトからのaddメソッドを適応してきましたが、私はそれを理解していない、と私はそれがエリアテーブル相続人
+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| area_id | int(11) | NO | PRI | NULL | auto_increment |
| area_title | varchar(40) | NO | | NULL | |
| area_name | varchar(40) | NO | | NULL | |
| org_id | int(11) | NO | | NULL | |
+------------+-------------+------+-----+---------+----------------+
に相続人
area_hierarchyテーブルを動作させることはできません
+------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| ancestor | int(11) | NO | | NULL | |
| descendant | int(11) | NO | | NULL | |
| lvl | int(11) | NO | | NULL | |
+------------+---------+------+-----+---------+----------------+
相続人は私がエントリを追加するために使用しようとしている方法:
public function add($node_id, $target_id) {
$sql = 'SELECT ancestor, '.$node_id.', lvl+1
FROM area_hierarchy
WHERE descendant = '.$target_id.'
UNION
SELECT '.$node_id.','.$node_id.',0';
$query = 'INSERT INTO area_hierarchy (ancestor, descendant,lvl) ('.$sql.')';
$result = $this->db->query($query);
return $result;
}
ので具体的には、$は何ですかnode_id、および$ target_id。
lvl + 1とは何ですか?
新しいトップレベル領域を追加すると、このデータはどのようなデータに渡されますか?
クエリも失敗したとarea
テーブルからarea_id
列の値になりますUNION
ノードIDは追加する新しいノード(子)で、ターゲットIDは親(祖先)ノードです。組合は自己参照に対処することです。自己参照は常に閉じておくべきです。 BをDの下に追加したい場合は、Bのすべての祖先を選択してDとの関係を作成する必要があります。また、D = Dの場合、結合の自己参照を作成する必要があります。 –
あなたの例では、10個のエリア1,2,3,4,5があり、それらが全く同じ主キーを持っているとします。それらはすべてルートレベルに存在する必要があります。最初にそれらの領域を追加してから、各ノードに 'add($ areaId)'を呼び出します。次に、6,7,8を3の子にします。次に、それぞれの領域に対して 'add($ areaId、3)'を呼び出します。最後に、9と10を8の子にします。add($ areaId、8)を呼び出します。あなたの質問がなぜ失敗したのか、あるいは期待どおりに機能しないのかについて助けが必要な場合は、私たちにエラーと期待される結果を与える必要があります。 –
ありがとう、良い説明。私は離れて、experiement – frobak