Jak na dvojitý JOIN v Nette\Database

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

Ahoj,
v databázi mám tři tabulky: „napoje“, „typ“, „napoje_typ“.
V tabulce „napoje“ jsou uvedeny nápoje v nabídce (např. pivo, víno, kofola, káva, čaj, zonka, voda), v tabulce „typ“ jsou uvedeny typy (druhy) nápojů kam může každý nápoj spadat (např. studený, teplý, alkoholický, osvěžující, povzbuzující) no a nakonec tabulka „napoje_typ“ tyto dvě tabulky spojuje a každému nápoji přiřazuje typ.

No a já mám problém, položit v Nette\Database dotaz, který mi vrátí například všechny studené nápoje. V čistém SQL bych problém neměl, prostě bych si to přes dva JOINy spojil a pak bych si to jednoduše vyselektoval. V Nette\Database ale moc nevím jak na to. Všechny tabulky samozřejmě mám jako InnoDB.

Pro rychlejší orientaci ještě přikládám odkaz zjednodušeného ERD: http://www.jpeg.cz/…16/RY4Th.png

Zatím jsem se snažil postupovat podle https://doc.nette.org/…ase/explorer a mám tento kód:

		$napoje = $this->database->table('napoje');

		foreach ($napoje as $napoj) {
			echo 'nazev: ' . $napoj->nazev;

			echo 'typ:';
			foreach ($napoje->related('napoje_typ') as $typ) {
				echo $typ->typ->nazev;
			}
		}

Jenže mi laděnka vyhazuje „Call to undefined method Nette\Database\Table\Selection::related()“.

vvoody
Člen | 910
+
+1
-

tu máš preklep

$napoje->related(...)

ma to byť asi

$napoj->related(...)

a ta joinovaná podmienka sa píše nasledovne

$this->database
	->table('napoje')
	->where(':napoje_typ.id_typ', $typId);

alebo

$this->database
	->table('napoje')
	->where(':napoje_typ.typ.nazev', $typNazev);
kloban
Člen | 123
+
0
-

Díky, opravil jsem. Chyba je ale stále jen jiná. Laděnka teď vypisuje: No reference found for $napoj->related(napoje_typ)
Co je tím myšleno?

David Matějka
Moderator | 6445
+
0
-

pouzivas innodb a mas spravne FK?

kloban
Člen | 123
+
0
-

Ano, používám innoDB a cizí klíče mám nastavené takto:

id_napoje napoje(id) RESTRICT RESTRICT

id_typ typ(id) RESTRICT RESTRICT

vvoody
Člen | 910
+
0
-

Aký reflection používaš?

kloban
Člen | 123
+
0
-

vvoody napsal(a):

Aký reflection používaš?

Jak to zjistím? Napadlo mě jen print_r($napoje->getDatabaseReflection());

Vypsalo to:

Nette\Database\Reflection\DiscoveredReflection Object
(
    [connection:protected] => Nette\Database\Connection Object
        (...
vvoody
Člen | 910
+
0
-

Áno, to som chcel vedieť. Urob kompletný sql dump štruktúry tabuliek a pastni to sem.

kloban
Člen | 123
+
0
-

Celé řešení co zde popisuji jsem hodně zjednodušil, a tudíž částečně přepisoval ručně. Takže jsem ho sem napsal správně a ve skutečnosti byl v originále ještě jeden překlep. Vynechal jsem jedno písmenko v názvu tabulky. A to i přes to, že do toho hledím druhej večer a názvy jsme několikrát kontroloval… Příště to sem hodím celý. :-D

Každopádně moc díky za reakce, protože bez vašeho nakopávání bych na to snad nikdy nedošel. :-)