Spojování tabulek skrze Nette Explorer

Sitole
Člen | 39
+
0
-

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

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

@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á.