Nette\Database – řazení dle jiného sloupce tabulky
- thm
- Člen | 147
Zdravím vás,
řeším následující problém, který nemůžu rozlousknout.
Mám tabulky:
- GALLERY(id, …)
- PICTURE(id, …)
- GALLERY_PICURE_CONNECTOR(id, gallery_id, picture_id, order)
mám nastavené cizí klíče, takže mi funguje:
// $galleryPictureConnection je ActiveRow
$galleryPictureConnection->picture->name;
$galleryPictureConnection->gallery->name;
Do systému vkládám obrázky a každý obrázek mohu použít v jakékoliv
fotogalerii.
Chtěl bych ale v každé fotogalerii obrázky řadit. Takže jsem přidal
sloupec order do tabulky GALLERY_PICURE_CONNECTOR, tak abych mohl
vyselektovat a seřadit obrázky v jedné galerii.
Ale nyní potřbuju vytvořit NDB dotaz tak, aby získal Selection z tabulky PICTURE z jedné galerie seřazené pomocí sloupce order.
Myslel jsem nějak takto:
//Vyberu fotogalerii
$gallery = $context->table('GALLERY')->where('name','Fotogalerie1')->fetch();
//Získám idčka obrázků
foreach($gallery->related('GALLERY_PICURE_CONNECTOR') as $connection)
$pictureIds[] = $connection->picture_id;
//Získám selection obrázků ve fotogalerii a rád bych seřadil obrázky podle sloupce z jiné tabulky
$context->table('PICTURE')->where('id',$pictureIds)->order('GALLERY_PICURE_CONNECTOR.order');
Jenže NDB zahlásí Missing reference, což asi dává smysl, protože obrázek může být vícekrát v tabulce GALLERY_PICURE_CONNECTOR.
Jak na to? A vůbec se mi to celé nějak nezdá. Přijde mi že to nedělám celé dobře.
- David Matějka
- Moderator | 6445
pouzij backjoin (a to jak pro razeni, tak filtrovani)
Editoval matej21 (24. 9. 2014 16:30)
- thm
- Člen | 147
@matej21 Díky moc, včera jsem se nad tím mořil ale asi tomu
prostě nějak nerozumím. Resp. v dokumentaci, v příkladu je asi něco
navíc, nebo to co zrovna nepotřebuju, co nepasuje na můj příklad (není tam
řazení).
Můžu poprosit o konkrétní příklad, jak získám selection z tabulky
PICTURE ke koknrétní galerii seřazené podle sloupce order ze spojovací
tabulky pomocí toho backjoinu?
Lépe to pochopím na konkrétním příkladě.
Prozatím jsem provedl:
$context->query('
SELECT order, picture_id FROM gallery_picture_connector
JOIN picture
ON picture_id = picture.id
WHERE gallery_id = '.$galleryId.'
ORDER BY number
');
Ale stejně bych rád Selection, abych na výsledku mohl ještě volat ->where()
Editoval thm (25. 9. 2014 9:18)
- David Matějka
- Moderator | 6445
$context->table('picture')
->where(':gallery_picture_connector.gallery_id', $gallery_id)
->order(':gallery_picture_connector.order');
- thm
- Člen | 147
Díky moc @matej21. A už jsem to z toho i pochopil. A funguje to – resp. složí to dotaz.
Jenom mi PDO vyhazuje Column ‚id‘ in where clause is ambiguous, protože to chce SELECT * a v obouch tabulkách je sloupec id. Dá se to na úrovni NDB nějak pořešit (id AS id2)? Nebo mám jedno id přejmenovat v DB?
Editoval thm (25. 9. 2014 12:56)
- David Matějka
- Moderator | 6445
si tam jeste do where neco pridaval? jak vypada zkonstruovany dotaz?
Editoval matej21 (25. 9. 2014 13:12)