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 | 88
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 ?