Autor Zpráva
kubatt
Profil
Ahoj mám problém v nette v metodě Database Table není příkaz Join a nevím ani jak by to tedy šlo... ale problém je vtom že mám query dotaz
SELECT Topics.* FROM Topics LEFT JOIN Posts on Topics.Id = Posts.ContentId GROUP BY Topics.ContentId ORDER BY Posts.TimeCreated DESC
Který se zdá že funguje ale problém nastává když chci použít ref()
$topic->ref('Content')
to vypíše chybu... chtěl bych se tedy zeptat zda ten JOIN nelze nějak v tom Nette použít nebo zda není jiné řešení jak se dostat k těm cizím klíčům.
Děkuji
Jan Tvrdík
Profil
kubatt:
Jakým způsobem ten dotaz pokládáš? Jakou chybu to píše?
kubatt
Profil
Pokládám to takto
$topics = $database->query('SELECT Topics.* FROM Topics LEFT JOIN Posts on Topics.Id = Posts.ContentId GROUP BY Topics.ContentId ORDER BY Posts.TimeCreated DESC');
a chyba je
Call to undefined method Nette\Database\Row::ref()
při volání
$topic->ref('Content')
Jan Tvrdík
Profil
kubatt:
Objekt Nette\Database\Row nemá metodu ref. Tu metodu má Nette\Database\Table\ActiveRow. Nemůžeš kombinovat ručně psané SQL dotazy s magickým přístupem, který nabízí ref.
kubatt
Profil
Já to vím.. a proto se tady ptám jak to vyřešit? Abych se tak dostal na ten cizí klíč...
Třeba jak přepsat ten sql dotaz do Nette
Jan Tvrdík
Profil
kubatt:
Zkoušel jsi něco jako $context->table('Topic')->order(':Post.TimeCreated DESC')?
kubatt
Profil
Jo jen bez te dvojtečky a vypíše to chybu
No reference found for $Topics->Posts
matej21
Profil
Pouzivas InnoDB a mas spravne nastavene cizi klice? ty jsou pro fungovani NDBT (pri pouziti discovered reflection) nezbytne.

Ta dvojtecka, jak pise Honza, je dulezita. Jen teda misto Post pouzij Posts, jestli spravne chapu strukturu databaze (ale stejne ji radeji ukaz :))

Ale obavam se, ze ten dotaz nebude fungovat tak, jak si prejes (ta kombinace order a group by)..
kubatt
Profil
Ono to celé funguje když napíšu jen
$topics = $database->table('Topics')
ale ja to potřebuju seřadit podle posledního příspěvku v tom tématu

Struktura tabulky Topics

Struktura tabulky Posts
Alphard
Profil
kubatt:
Jestli jste našel řešení a zamknul vlákno úmyslně, bylo by dobré napsat sem to řešení pro ostatní hledající.
Jestli jste to tu zamčel omylem, nyní jsem to napravil.
kubatt
Profil
No ja sem to tu nechtěl psát protože sem to nakonec vyresilo tak ze sem to nepouzil a udělal jsem to přes $ databaze->query
a ref sem nahradil klasickým query dotazem výsledný sql dotaz je ale tenhle
SELECT Topics.* FROM Topics LEFT JOIN Posts on Topics.ContentId = Posts.ContentId JOIN Content on Topics.ContentId = Content.Id GROUP BY Topics.ContentId ORDER BY Topics.Pin DESC, CASE WHEN COUNT( Posts.TimeCreated ) = 0 THEN Content.TimeCreated ELSE Posts.TimeCreated END DESC
takže to spíše teď patří do téma databáze a ne sem už :/ale někdo se z toho sql dotazu muže třeba naučit používat CASE WHEN :3
takže z toho vyplývá ze to v Nette proste nejde :) takže to nemá vlastně reseni ne? :P

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: