Dotaz v Nette\Database – vybrání řádků z první tabulky na základě hodnoty v druhé tabulce (které jsou n:n)
- thm
- Člen | 149
Prosím o pomoc s tímto příkladem:
Mám tabulku např. Smlouva (smlouvaId, název) na kterou již aplikuju nějaký ->where()->where() ..
Nyní potřebuju výběr ještě zúžit pro následující:
Smlouva může mít jednoho, nebo více smluvních partnerů, proto mám tabulku Adresář (adresářId, jméno, příjmení, …) a tabulku, která je propojuje třeba SmluvníPartneři (smlouvaId, adresářId)
Potřebuju nějak sestavit další ->where(?) – potřebuju výběr zúžit na smlouvy, u kterých vystupuje jako smluvní partner konkrétní jméno v adresáři (znám adresářId).
(napadlo mě zjistit si všechny smlouvaId (z tabulky SmluvníPartneři, kde adresářId bude to co hledám) a pak do where dát smlouvaId = 56 OR smlouvaId = 135 OR …, ale to mi nepřijde moc v pořádku)
Editoval thm (11. 9. 2013 13:21)
- thm
- Člen | 149
No špatně jsem to asi zformuloval – no na blbou otázku, blbá odpověď, omlouvám se. Konkrétně popíšu tabulky a dám příklad.
Tabulka Smlouva:
ID_SMLOUVA NÁZEV
1 Smlouva1
2 Smlouva2
3 Smlouva3
Tabulka SmluvníPartneři
ID_SMLOUVA ID_ADRESA
1 2
2 2
3 1
1 3
Tabulka Adresář
ID_ADRESA JMENO
1 Vodafone
2 T-Mobile
3 O2
Takže,
- Smlouva1 má smluvní partnery T-Mobile a O2
- Smlouva2 jenom T-Mobile
- Smlouva3 jenom Vodafone.
A já potřebuju položit dotaz nad tabulkou Smlouvy – ukaž mi názvy smluv u kterých je smluvní partner T-mobile. Výsledek bude Smlouva1 a Smlouva2.
- Oli
- Člen | 1215
No, pořád si myslím, že moje řešení je funkční. Možná ne optimální, ale funkční.
$smluvniPartneri = $this->connection->table('SmluvníPartneři')->where(array(
'adresar.jméno' => 'T-mobile',
));
// použití
foreach ($smluvniPartneri as $partner)
{
dump($partner->smlouva->název); // Vypíše Smlouva1 a Smlouva2
}
U m*n dotazů to používám takhle, když potřebuju přistupovat do obou tabulek. Jestli to je blbě, tak mě snad někdo opraví ;-)
- thm
- Člen | 149
Aha :) Tak já jsem to asi blbě pochopil a ty správně :) resp. s tím použitím už tomu rozumím. Díky.
Ale stejně bych toto potřeboval implementovat do toho dotazu:
$selection = $this->smlouvaRepository->getAll()->where('typ','nájemní')->where('rok','2012')->where('smluvní partner je třeba T-mobile')
Editoval thm (11. 9. 2013 13:52)
- David Matějka
- Moderator | 6445
@thm: verze nette?
v 2.0 by to melo jit zhruba takhle
->where('SmluvniPartneri:adresa.name', 'T-mobile')
v 2.1 takhle ->where(':SmluvniPartneri.adresa.name', 'T-mobile')
ale mas na prd nazvy tabulek atd. tak nevim, jak a jestli se ti to povede :)
btw. opravdu pouzivas diakritiku v nazvu tabulek?
- David Matějka
- Moderator | 6445
@Oli: spis jen utrzky ruzne po foru, nekde byla
nejaka hrachova prezentace ohlene nette\database, ale ted to nemuzu najit –
byla sice pro 2.0, ale v 2.1 je akorat rozdil v 1:n relacich a presunu
dvojtecky, jak vidis v tom mem prispevku.
jinak ten tvuj zpusob je taky mozny a nemyslim, ze by byl spatny..
- thm
- Člen | 149
@matej21: Mám verzi 2.0.10, diakritiku nepoužívám (to bylo jen pro názornost). Díky za tip vyzkouším to. Předpokládám, že musím mít v DB nastavené cizí klíče (já to totiž nenastavuju, myslím že mi to ani ->ref(‚tablulka‘), related(‚tabulka‘) nefungovalo i když jsem to měl nastavené (asi – v MySQL jsem nastavil relace na jinou tabulku). Takže používám ->ref(‚tabulka‘,‚sloupec‘) a ->related(‚tabulka‘,‚sloupec‘).
Ale tohle kdyby fungovalo, tak se v tom ještě popídím, proč mi to nešlo, protože to bylo super.
Díky moc, škoda že toto není součástí dokumentace, jak píše Oli, protože to je pak o něčem jiném.
Editoval thm (11. 9. 2013 15:10)
- David Matějka
- Moderator | 6445
spravne nastavene klice musis mit nastaveny, pokud pouzivas discovered reflection (a tu pouzivas, pokud si to nemenil) – ta urcuje vazby prave podle klicu. alternativou je conventional reflection, ktera urcuje vazby dle urcitych pravidel.
jo, dokumentace je jedna z nejvetsich slabin nette\database (po bugach :)).
- David Matějka
- Moderator | 6445
tak jsem nasel, co jsem hledal – http://public.skrasek.com/…_2012_04_28/ (radeji spustte ve ff, v chrome to blbne); pro 2.1 se presunula dvojtecka (viz vyse)