->related() na dvousloupcový cizí klíč (do vlastní tabulky)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
spagr
Člen | 17
+
0
-

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é ?

uložená laděnka zde

Díky předem za pomoc
Špágr

piskotek
Člen | 35
+
0
-

Ahoj, mám podobný problém, vyřešil jsi to už nějak?

spagr
Člen | 17
+
0
-

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;
?>