Vicenasobny join nette database, je to vubec mozne?
- Ja
- Člen | 260
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
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 :)
- David Matějka
- Moderator | 6445
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
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
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
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
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
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?