Dotaz v Nette\Database – vybrání řádků z první tabulky na základě hodnoty v druhé tabulce (které jsou n:n)

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

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)

Oli
Člen | 1215
+
0
-

Pokud jsem to pochopil dobře, tak bych řekl takhle nějak:

$this->connection->table('smluvníPartneři')->where(array(
	...
	'adresar.jméno = ?' => $jmeno,
	'adresar.příjmení = ?' => $prijmeni
));
thm
Člen | 149
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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

Oli
Člen | 1215
+
0
-

@matej21: Je někde o té dvojtečkové notaci někde něco? V dokumentaci se nic mám pocit přes rok neměnilo ohledně db.
btw. to moje řešení je špatně, nebo je tohle jen elegantnější?

Díky

David Matějka
Moderator | 6445
+
0
-

@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
+
0
-

@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
+
0
-

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
+
0
-

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)