->related() na dvousloupcový cizí klíč (do vlastní tabulky)
- spagr
- Člen | 17
Zdravím,
přepisuji pod Nette stávající aplikaci, mám v tabulce skupin více
třídění, či stromů, chcete-li, PRIMARY KEY je tedy na dvou sloupcích
A tedy i jeden potřebný FOREIGN KEY je přes dva sloupce, mám tedy tuto
strukturu tabulky :
CREATE TABLE `category` (
`id` int(10) unsigned NOT NULL DEFAULT '0',
`sorting_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT 'Několik třídění v jedné tabulce ',
`name` text COLLATE utf8_czech_ci,
`parent_id` int(10) unsigned DEFAULT NULL,
`depth` int(4) unsigned NOT NULL DEFAULT '0',
`active` tinyint(4) NOT NULL DEFAULT '0',
`order` int(11) DEFAULT NULL,
`added` datetime DEFAULT NULL,
PRIMARY KEY (`id`,`sorting_id`),
KEY `sorting` (`sorting_id`),
KEY `id` (`id`),
KEY `parent_sorting` (`parent_id`,`sorting_id`),
KEY `parent_id` (`parent_id`),
CONSTRAINT `category_ibfk_1` FOREIGN KEY (`sorting_id`) REFERENCES `sorting` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `category_ibfk_3` FOREIGN KEY (`parent_id`, `sorting_id`) REFERENCES `category` (`id`, `sorting_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
Nette Database si s tímto ale asi neumí dost dobře poradit,
<?php
foreach ($higherCategory->related('category.parent_id') as $lowerCategory ) ...
?>
končí nezdarem, jestli jsem se neztratil v call stacku, tak z discovered reflection se do metod ActiveRow v argumentech pro název sloupce metod dostává, místo očekávaného stringu, array a zde vzniká celý problém, je toto nějak řešitelné ?
Díky předem za pomoc
Špágr
- spagr
- Člen | 17
Ahoj,
čistě za pomoci features NDB bohužel ne,
ručně si klasicky v modelu rozšiřuji vrácené výsledky hlavních
categories o subcategories, jen jsem to snažil udělat maximálně čistě se
zachováním ActiveRow výhod, tedy vynechat tupé převedení na pole, a
použil na rozšíření subCategories poděděný RowWrapper, viz. toto : https://forum.nette.org/…ed-read-only
a následně
<?php
// ... other logic ...
// ...
$results = array();
foreach ($topCategories as $key => $row) {
$wrapper = new RowWrapper($row); // __construct(Nette\Database\Table\ActiveRow $row)
$wrapper->children = $this->db->table('category')
->where('parent_id', $wrapper->id)
->order('name');
$results[$key] = $wrapper;
}
return $results;
?>