class Model_Category extends ORM { 'model' => 'category', 'through' => 'categories_categories' ), 'model' => 'category', 'through' => 'categories_categories' ) ); }
Tabele:
CREATE TABLE IF NOT EXISTS `categories` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(64) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `categories_categories` ( `category_id` INT(10) UNSIGNED NOT NULL, `child_id` INT(10) UNSIGNED NOT NULL, PRIMARY KEY (`category_id`,`child_id`), KEY `fk_child_id` (`child_id`), KEY `fk_category_id` (`category_id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8; ALTER TABLE `categories_categories` ADD CONSTRAINT `categories_categories_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE, ADD CONSTRAINT `categories_categories_ibfk_2` FOREIGN KEY (`child_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE;
Testując poniższym kodem:
$model = new Model_Category(1); $array = $model->children->find_all(); foreach($array as $obj) { foreach($obj->categories as $parent) { } }
Pobieranie potomków działa bez zarzutu - pobieranie rodziców zwraca pustą tablicę. Zastanawiam się jak to zrobić:
1. Utworzyć tabelę relacji z trzema kolumnami: category - parent - child (co dość kosmicznie wydłużyłoby tabelę relacji, dlategoż ten pomysł mi się nie podoba)
2. Utworzyć dwie osobne tabele relacji: jedną dla potomków, drugą dla rodziców (ku czemu się skłaniam)
Czy może jest jakiś bardziej elegancki sposób?