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
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
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.
- jtousek
- Člen | 951
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)