NDB – select provázaných produktů

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

Chci zobrazit provázané produkty s konkrétním zbožím – mám zjednodušeně tyto tabulky v InnoDb.

CREATE TABLE `products` (
  `id` TINYINT NULL AUTO_INCREMENT DEFAULT NULL,
  `name` VARCHAR NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `product_related` (
  `product_id` TINYINT NULL DEFAULT NULL,
  `product_related_id` TINYINT NULL DEFAULT NULL,
  PRIMARY KEY (`product_id`, `product_related_id`)
);

-- ---
-- Foreign Keys
-- ---

ALTER TABLE `product_related` ADD FOREIGN KEY (product_id) REFERENCES `products` (`id`);
ALTER TABLE `product_related` ADD FOREIGN KEY (product_related_id) REFERENCES `products` (`id`);

Napadlo mě udělat něco jako

$selected = $product->related('product_related', 'product_id')->select('product_related_id');
$this->findAll()->where('id', $selected);

Což ale vytvoří select, který hledá nejen provázané zboží, ale i ono samotné zboží – např. pokud má product_id = 1290, tak to vypadá takto:

SELECT *
FROM `products`
WHERE (`id` IN (1290, 924, 1290, 1099, 1290, 1067))

Jak to mám omezit, aby hledal jen podle product_related_id (zmizlo to 1290) ?

Nette 2.0.5

Díky.

hrach
Člen | 1838
+
0
-

Chvili mi trvalo pochopit, co a jak, ale nakonec sem to pochopil a zjistil, ze to funguje dobre :) Jen mozna ty to neuvedomujes.

Melo by to vypadat asi takhle:

$products = ...;
foreach ($products as $product) {

	echo $product->name;
	echo "pribuzne produkty:";
	foreach ($product->related('product_related.product_id') as $related) {
		$product->product_related->name;
	}
}

To by melo fugnovat.

Ivorius
Nette Blogger | 119
+
0
-

To funguje, jenže já to nechci vypisovat, ale předat komponentě, která očekává Nette\Database\Table\Selection se seznamem produktů.

jtousek
Člen | 951
+
0
-

Klasická M:N relace pro kterou v Nette chybí podpora. Moji testovací implementaci najdeš zde. Mělo by to fungovat takhle:

foreach ($products as $product) {
        echo $product->name;
        echo "pribuzne produkty:";
	//relatedMany vrací Selection nad tabulkou products
        foreach ($product->relatedMany('product_related', 'product_id', 'products', 'product_related_id') as $related) {
                $related->name;
        }
}

Editoval jtousek (14. 9. 2012 17:48)