M:N řazení tabulky a dle parametru tabulky b

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

Ahoj,

zatím to řeším přímým sql dotazem, ale zajímalo by mě, jak toho lze čistě docílit v Nette\Database Nastíním use case na demu z dokumentace .

Představte si, že tabulka tag má kromě name ještě parametr weight. A já chci zjistit pro každou knížku, jaký její tag má weight největší a podle nich pak všechny knížky seřadit. Jak na to?

Díky :)

hrach
Člen | 1838
+
0
-

Sice už to nebude tak optimální, pač je tam pak select k ničemu (na druhou stranu, pokud je weight v indexu, tak se nemusi sahat v tom spojovacim dotazu na data->nejaka optimalizace to stale je), ale třeba takto:

foreach($db->table('book') as $book) {
	foreach ($book->related('book_tag')->order('tag.weight') as $bookTag) {
		$bookTag->tag->name;
	}
}
pidiclovek
Člen | 91
+
0
-

Díky za odpověď :) No něco takového jsem vlastně zkoušel. Spíš koumám nad tím, jak to napasovat na situaci, kdy už mám v tomto případě $book selection nějak i omezenou příkazy where, limit, offset apod a chtěl bych už tuhle načtenou selection seřadit. Takto by se musela lišit i šablona, která by byla např:

{foreach $books as $b}
{$b->name}
{/foreach}

protože já už bych nedával do $books tabulku book, ale vlastně vztahovou book_tag přes kterou bych se tam dostával. Takže by tam muselo být jak jsi napsal $b->tag->name. Co s tím? Šablona je celkem ukrutná a ne takto jednoduchá a duplikovat kód mi taky nepřijde moc optimální. :)

hrach
Člen | 1838
+
0
-

Vubec nechapu.

pidiclovek
Člen | 91
+
0
-

Omlouvám se za zamlžení :) Dejme tomu, že již z předchozího zpracování mám v $books něco takovéhleho:

$books = $db->table('book')->where('foo',array(1,2,5,8))->limit(15);

a k ní mám tu výše uvedenou šablonu. Teď bych chtěl tato data využít a přesně tuto selekci, protože ji mám už načtenou a nechci těmi samými parametry selectovat jinou novou.

A nynější $books chci seřadit pravděpodobně neexistuícím kouzelným způsobem $books->order(‚magic‘); tak, abych dosáhl výše popisovaného. Snad je to už lépe popsané :)

hrach
Člen | 1838
+
0
-

Tak pak to neni M:N vztah, ale proste chces seradit vybrana data. Zalezi dle ceho chces ty knihy seradit. Kazdopadne, pokud to chces radit podle dat v db, tak nezbyva, nez udelat novy db dotaz.

pidiclovek
Člen | 91
+
0
-

Jasně, neni přímo, ale řadim to dle informací z M:N vztahu. Dokud to z něj nebylo, stačilo mi na již načtený data pověsit ještě další where, když jsem to chtěl dospecifikovat, myslel jsem si, že to budu muset vyselektovat znova, protože je to dle parametru z jiné tabulky… No ještě prozkoumam situaci v závislosti na chache a nette\db vs. čistý sql a rozhodnu se dle toho. Ale díky za pomoc :)