M:N řazení tabulky a dle parametru tabulky b
- pidiclovek
- Člen | 91
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
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
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í. :)
- pidiclovek
- Člen | 91
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é :)
- pidiclovek
- Člen | 91
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 :)