Spojení se stejnou tabulkou
- Odo
- Člen | 48
Ahoj všem,
nedaří se mi vyřešit join se stejnou tabulkou – nevím, jak správně
použít alias
a/nebo joinWhere
:
...->table('member_licence')
->select('*')
->alias('member_licence', 'l')
->joinWhere('l', 'l.member_id=member_licence.member_id AND l.category=?', 'ii')
->select('l.certificate');
// generuje LEFT JOIN `l` ON . = `l`. AND (`l`.`member_id`=`member_licence`.`member_id` AND `l`.`category`=?)
Očekávaný výsledek:
SELECT *,l.certificate
FROM member_licence
LEFT JOIN member_licence l
ON l.member_id=member_licence.member_id AND l.category='ii'
WHERE member_licence.category IN ('ia','ib','ic')
Skutečný dotaz do databáze je mnohem složitější a kvůli takové
prkotině se mi NDB nechce přepisovat do obyčejného query()
.
Předem díky za rady.
[Nette 2.4]
Editoval Odo (1. 5. 2020 18:22)
- Odo
- Člen | 48
Tak jsem na to přišel, já věděl, že to musí být jednoduché :)
Tabulka member_licence
je provázaná s tabulkou
member
, takže zápisem .member:member_licence
se
dostanu zpět k tabulce member_licence
podruhé, přičemž Nette
mě upozorní, že musím pro duplicitní jméno tabulky nastavit alias.
Takže správně takto:
...
->alias('.member', 'm') // tenhle alias není nutný, ale používám ho ve zbytku dotazu
->alias('m:member_licence', 'l') // nastavím alias pro druhou tabulku
->joinWhere('l', 'l.category="ii"') // přidám podmínku ON
->select('l.certificate') // vyberu z druhé tabulky co chci
...
Akorát netuším, proč Nette ve výsledném SQL používá alias
m_ref
místo mého l
:)
...
FROM `member_licence`
LEFT JOIN `member` `m` ON `member_licence`.`member_id` = `m`.`id`
LEFT JOIN `member_licence` `m_ref` ON `m`.`id` = `m_ref`.`member_id` AND (`m_ref`.`category`="ii")
...
Editoval Odo (1. 5. 2020 18:22)
- MikKuba
- Člen | 83
Odo napsal(a):
Ještě malý dotaz na autory NDB:
joinWhere()
se tváří, že v něm lze používat placeholdery (parametry), ale následující zápis vyhodí chybu:->joinWhere('l', 'l.category=?', 'ii')
Taky jsem nyní při používání joinWhere()
narazil na to,
že když jako třetí parametr zadám nějakou hodnotu pro dosazení, tak se
úplně vyignoruje.
cc @DavidGrudl @hrach ?