Nette\Database – řazení dle jiného sloupce tabulky

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

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
+
0
-

pouzij backjoin (a to jak pro razeni, tak filtrovani)

Editoval matej21 (24. 9. 2014 16:30)

thm
Člen | 147
+
0
-

@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
+
+1
-
$context->table('picture')
        ->where(':gallery_picture_connector.gallery_id', $gallery_id)
        ->order(':gallery_picture_connector.order');
thm
Člen | 147
+
0
-

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
+
0
-

si tam jeste do where neco pridaval? jak vypada zkonstruovany dotaz?

Editoval matej21 (25. 9. 2014 13:12)

thm
Člen | 147
+
0
-

No máš pravdu, přidával. Už je to ok. Omlouvám se. Měl jsem Selection uloženou v proměnné a nevšiml jsem si že jsem na ní už dříve volal where.