Jak na dvojitý JOIN v Nette\Database
- kloban
- Člen | 123
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()“.
- kloban
- Člen | 123
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
(...
- kloban
- Člen | 123
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. :-)