Propojení SELECT s WHERE v jiné tabulce

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

Zdravím, mám takový zajímavý problém. Rozhodl jsem se naplno začít využívat Foreign Keys.
Avšak mám tu jeden zádrhel. Vezmeme si příklad, že chci vybrat data závodu, ve kterém jezdil určitý řidič.
Mám tedy tabulky „races“ a „race_drivers“ (tam mám sloupec race_id jako foreign key k id v tabulce races).

Zkoušel jsem něco podobného, avšak mám pocit, že je to trochu chybné

$races = $this->db->table("races")
	->where("race_drivers.driver_id = ?", $driver_id)
	->fetch();

Nacož dostanu chybu

No reference found for $races->race_drivers.

Když kouknu na položené dotazy, vidím že se hledají cizí klíče z tabulky „races“. Nemělo by to spíše hledat z tabulky race_drivers? Jak jinak můžu elegantně takto propojit tabulky? Takto to funguje, ale příjde mi to prasácky:

$races = $this->db->table("race_drivers")
	->select("race_drivers.*, races.*")
	->where("race_drivers.driver_id", $id)
;

Editoval genesiscz (12. 7. 2014 1:46)

Taps
Člen | 169
+
-4
-

tabulky můžeš ještě propojit pomoci inner join, viz níže uvedený příklad

select('product_id')->as('id')
    ->select('title')
    ->from('products')
    ->innerJoin('orders')->where('(product_id)')
David Matějka
Moderator | 6445
+
0
-

pokud chces filtrovat dle „has many“ smeru, musis tam pridat dvojtecku, viz https://doc.nette.org/…ase/explorer#…

$races = $this->db->table("races")
    ->where(":race_drivers.driver_id = ?", $driver_id)

bez dvojtecky by to bylo v opacnem smeru, pokud bys treba chtel vybrat ridice dle treba datumu zavodu

$drivers = $this->db->table("race_drivers")
	->where("race.date = ?", new \DateTime);
David Matějka
Moderator | 6445
+
0
-

tohle v nette\database opravdu fungovat nebude :)