Vicenasobny join nette database, je to vubec mozne?

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

Ahoj,
jde zapsat vicenasobny join „fluently“?

Predstavte si, ze mate tabulky: ‚uzivatel‘, ‚zprava‘, ‚zprava_to_uzivatel‘, vztah M:N

‚zprava‘ ma sloupec ‚id_uzivatel‘, coz je reference na toho, jenz ji odeslal

‚zprava_to_uzivatel‘ ma sloupce ‚id_uzivatel‘ (oznacuje prijemce), ‚id_zprava‘

a ted potrebujete zapsat join typu:

select prijemce.prijmeni, odesilatel.prijmeni, z.predmet
from zprava z
join zprava_to_uzivatel ztu ON z.id = ztu.id_zprava
join uzivatel prijemce ON ztu.id_uzivatel = prijemce.id
join uzivatel odesilatel ON z.id_uzivatel = odesilatel.id;

tzn dvakrat napojit uzivatele, jednou jako ‚prijemce‘, jednou jako ‚odesilatel‘. Je to mozne, nebo si mam nechat zajit chut?

Duvod: Potrebuju IDataSource pro napojeni na Grido.

Diky
Ja

David Matějka
Moderator | 6445
+
0
-

z toho soudim, ze zprava muze mit vice prijemcu. jak bys to chtel zobrazit v tom gridu? zobrazit radek se spravou dle kazdeho prijemce te konkretni zpravy? nebo jak :) pak ti mozna poradim, jak to zapsat :)

Ja
Člen | 260
+
0
-

presne tak, i kdyz ta zprava pujde trem lidem, bude pod sebou trikrat zduplikovana:

odesilatel | prijemce | predmet
----------------------------------
milos      | petr     | prazdniny
milos      | lenka    | prazdniny
milos      | honza     | prazdniny
David Matějka
Moderator | 6445
+
0
-

ok… ono je to sice proti konceptu NDBT, ale v pripade gridu je to ospravedlnitelne :)
snad to bude fungovat.. zkusil bych to vzit od te zprava_to_uzivatel tabulky, jinak to ndbt nejak zgroupuje, takze zkus neco jako

$database->table('zprava_to_uzivatel')
->select('zprava_to_uzivatel.*, zprava.predmet, uzivatel.prijmeni AS prijemce, zprava.uzivatel.prijmeni AS odesilatel');

jen nevim, jak si ndbt poradi s tim, ze se 2× pripojuje tabulka uzivatel :)

Ja
Člen | 260
+
0
-

Bohuzel, neco podobneho jsem uz zkousel :) NDBT to neprechrousta, takze jsme tim ziskali bohuzel jen 2× odesilatele.

Vysledny sql:

SELECT `zprava_to_uzivatel`.*, `zprava`.`predmet`, `uzivatel`.`prijmeni` AS `prijemce`,
`uzivatel`.`prijmeni` AS `odesilatel`
FROM `zprava_to_uzivatel`
LEFT JOIN `zprava` ON `zprava_to_uzivatel`.`id_zprava` = `zprava`.`id`
LEFT JOIN `uzivatel` ON `zprava`.`id_uzivatel` = `uzivatel`.`id`
LIMIT 2
David Matějka
Moderator | 6445
+
+1
-

mozna to pujde „hacknout“, zkus schvalne:

$database->table('zprava_to_uzivatel')
->select('zprava_to_uzivatel.*, zprava.predmet, uziv.prijmeni AS prijemce, zprava.uzivatel.prijmeni AS odesilatel');

je tam uziv misto uzivatel :) ndbt to ted mozna bude videt jako jinou tabulku a mozna ji jinak aliasuje :)

(ale bude hezci, kdyz si sloupecek prejmenujes na id_odesilatel a budes se dotazovat odesilatel.prjmeni)

Ja
Člen | 260
+
0
-
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'uziv.prijmeni' in 'field list'
SELECT `zprava_to_uzivatel`.*, `zprava`.`predmet`, `uziv`.`prijmeni` AS `prijemce`,
`uzivatel`.`prijmeni` AS `odesilatel`
FROM `zprava_to_uzivatel`
LEFT JOIN `zprava` ON `zprava_to_uzivatel`.`id_zprava` = `zprava`.`id`
LEFT JOIN `uzivatel` ON `zprava`.`id_uzivatel` = `uzivatel`.`id`
LIMIT 12

co Te vedlo k presvedceni, ze by NDBT ‚uziv‘ bral jako ‚uzivatel‘? :-)

David Matějka
Moderator | 6445
+
0
-

pouzivas discovered reflection a mas spravne nastaveny fk?

tam se totiz ono slovo hleda v nazvu sloupecku s FK (zda to slovo obsahuje), pokud se tedy sloupecek jmenuje „id_uzivatel“, mel by fungovat jakykoliv substring…

Ja
Člen | 260
+
0
-

https://dl.dropboxusercontent.com/…y_zprava.jpg

Verze nette:

VERSION = '2.2-RC4',
		VERSION_ID = 20200,
		REVISION = 'released on 2014-05-05';

toto vypada dobre, nepletu-li se?