Spojování tabulek skrze Nette Explorer
- Sitole
- Člen | 39
Ahoj,
už to tu řeším skoro celý den a stále jsem jaksi nepřišel na žádné
kloudné řešení.
Mám následující tabulky:
app_users: (id, nickname, name, surname)
app_messages: (id, sender, recipient, view, content)
Přičemž sender a recipient jsou propojeny s id v app_users, protože se
jedná o uživatele.
V ideálním případě bych chtěl vypsat z databáze seznam všech
uživatelů a u každého jedním číslem ukázat kolik mají nepřečtených
zpráv od nějakého (aktuálně přihlášeného) uživatele
$this->connection->table('app_users')
->select('COUNT(:app_messages.id) AS unread')
->joinWhere(':app_messages', ':app_messages.sender = app_users.id AND :app_messages.view = 0 AND :app_messages.recipient = ?', $recipient)
->group('app_users.id');
Což sice funguje, ale hned za LEFT JOIN app_messages
se přidá
záhadné ON app_users.id = app_messages.recipient
. Když kod
debuguji a tuhle část odstraním tak začne dotaz perfektně fungovat. Je
možné to nějak nastavit? Co případně dělám špatně?
Předem děkuji za odpověď.
Editoval Sitole (31. 7. 2018 20:41)
- norbe
- Backer | 405
Tabulka app messages má 2 cizí klíče do tabulky app_users. Nette tedy
při referenci zvolí náhodně jeden z nich, pokud si sám nespecifikuješ
který chceš použít. To se dělá
následovně: :app_messages(sender)
Výsledný zápis by tedy mohl vypadat cca takto (předpokládá že chceš pouze uživatele, od kterých nějaká nepřečtená zpráva existuje):
$this->connection->table('app_users')
->select('COUNT(:app_messages(sender).id) AS unread')
->where(':app_messages(sender).view = 0 AND :app_messages(sender).recipient = ?', $recipient)
->group('app_users.id');
Pokud by jsi podmínku nechal v joinWhere, načetli by se ti i záznamy s 0 zprávami..
- Sitole
- Člen | 39
@norbe Řešení mi pomohlo vůbec jsem nevěděl že tam tohle funguje a mohu si takhle určit skrze co se bude ta tabulka v Nette Explorer spojovat. Nakonec jsem si to ještě trošku upravil, protože chci vypsat všechny uživatele a u nich nepřečtené zprávy, takže jsem použil joinWhere.
$this->connection->table('app_users')
->select('COUNT(:app_messages(sender).id) AS unread')
->joinWhere(':app_messages(sender)', ':app_messages(sender).view = 0 AND :app_messages(sender).recipient = ?', $recipient)
->group('app_users.id');
Mockrát děkuji za pomoct teď to šlape jak má.