Nette database – Column not found
- Taps
- Člen | 168
Zdravím, v nette database mám níže uvedený dotaz
return $this->connection->table('projekty')
->where('foto.id_projektu= ?', 'id_projektu')
->where ('foto.uvodni=1');
Laděnka mi však vyhazuje chybu Column not found: 1054 Unknown column ‚projekty.foto_id‘ in ‚on clause‘. Jak bych tedy měl správně propojit tabulky projekty a foto. Struktura tabulek je následující
CREATE TABLE `foto` (
`id_foto` int(11) NOT NULL AUTO_INCREMENT,
`id_projektu` int(11) NOT NULL,
`nazev_cz` varchar(255) COLLATE utf8_czech_ci NOT NULL,
`uvodni` enum('0','1') COLLATE utf8_czech_ci NOT NULL,
PRIMARY KEY (`id_foto`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
CREATE TABLE `projekty` (
`id_projektu` int(11) NOT NULL AUTO_INCREMENT,
`realizace` int(11) NOT NULL,
`nazev_cz` varchar(255) COLLATE utf8_czech_ci NOT NULL,
`popis_cz` text COLLATE utf8_czech_ci NOT NULL,
PRIMARY KEY (`id_projektu`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
Děkuji
- vvoody
- Člen | 910
return $this->connection->table('projekty')
->where (':foto.uvodni=1');
Projekty to foto je one to many vazba, preto musíš použiť backjoin, to je
ta dvojbodka.
Druha vec, vazobnu podmienku generuje NDBT automaticky.
Ale aj tak neviem či to prejde, lebo používaš neštandardnú konvenciu pomenovania tabuliek a stĺpcov.
- Taps
- Člen | 168
vvoody napsal(a):
return $this->connection->table('projekty') ->where (':foto.uvodni=1');
Projekty to foto je one to many vazba, preto musíš použiť backjoin, to je ta dvojbodka.
Druha vec, vazobnu podmienku generuje NDBT automaticky.Ale aj tak neviem či to prejde, lebo používaš neštandardnú konvenciu pomenovania tabuliek a stĺpcov.
Díky, můžeš mi prosím poradit, jak by to mělo být korektně.
- David Matějka
- Moderator | 6445
Pouzivas MyISAM, takze bys musel dodrzovat konvence, ty jsou defaultne takhle (zkracene):
- primarni klic „id“
- „cizi klic“ nazev_cilove_tabulky_id, v tvem pripade by se ten sloupecek v tabulce „foto“ mel jmenovat „projekty_id“
ale kdyz pouzijes innodb a nastavis klice, pak jsou konvence vic benevolentni…
- Taps
- Člen | 168
matej21
Díky, strukturu databáze jsem upravil do níže uvedené podoby
CREATE TABLE `foto` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`projekty_id` int(11) NOT NULL,
`nazev_cz` varchar(255) COLLATE utf8_czech_ci NOT NULL,
`uvodni` enum('0','1') COLLATE utf8_czech_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
CREATE TABLE `projekty` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`realizace` int(11) NOT NULL,
`nazev_cz` varchar(255) COLLATE utf8_czech_ci NOT NULL,
`popis_cz` text COLLATE utf8_czech_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
Bohužel se mi sql generuje do takové podoby, netuším kde bych mohl dělat chybu
SELECT `projekty`.*
FROM `projekty`
LEFT JOIN `foto` ON `projekty`.`foto_id` = `foto`.`id`
WHERE (`foto`.`projekty_id`= 'id') AND (`foto`.`uvodni`=1)
return $this->connection->table('projekty')
->where('foto.projekty_id= ?', 'id')
->where ('foto.uvodni=1');
- Oli
- Člen | 1215
@Taps nemělo by to být spíš něco jako?
return $this->connection->table('projekty')
->where(':foto.projekty_id', 'projekty.id')
->where (':foto.uvodni', 1);
viz.: database selection
btw. ten MyISAM používáš z nějakého důvodu nebo jsi prostě zvolil nějakej typ?
- Taps
- Člen | 168
OLI
Děkuji, ve výsledku mi to vygenerovalo tento select
SELECT `projekty`.`id`
FROM `projekty`
LEFT JOIN `foto` ON `projekty`.`id` = `foto`.`projekty_id`
WHERE (`foto`.`projekty_id` = 'projekty.id') AND (`foto`.`uvodni` = '1')
Není možné aby bylo ve výsledku níže uvedené ?
select * from projekty p left join foto f on p.id=f.projekty_id where f.uvodni='1'
Děkuji z nette database začínám tak nevím jaké má nebo nemá možnosti.
Editoval Taps (10. 10. 2014 7:33)
- Oli
- Člen | 1215
S těma aliasama tabulek jsem v NDBT nikdy nepracoval, nevím jestli si je můžeš nastavit, ale řekl bych, že ne.
Jestli ti jde o tu hvězdičku, tak NDBT si nakešuje jaký sloupce tím
dotazem stahuješ. Když si ten dotaz zavoláš znovu, tak stáhne jen ty
sloupce, který stáhl minule. Takže ti to stáhne, jen to co používáš.
Teď ti to stáhlo jen id
, protože jsi nikde žádnej sloupec
nepoužil. Pokud by jsi ale potřeboval všechny sloupce vdžykcy, tak mezi
table
a where
vlož
->select('projekty.*') // případně ->select('projecty.*, foto.*')
- Taps
- Člen | 168
Oli,
spíše mi jde o to jestli jde vyhodit z dotazu níže uvedená část
WHERE (`foto`.`projekty_id` = 'projekty.id')
MyISAM používám ze zvyku, ale pokud bude lepší použit INNODB, tak klidně přejdu na něj. S využitím INNODB by vypadal tvůj dotaz (https://forum.nette.org/…mn-not-found#…) stejně.
Moc Děkuji
- Oli
- Člen | 1215
To jsi tam měl myslím někde ty. Jsem to prostě jen překopíroval a přepsal do NDBT. Ale ano, myslím, že to můžeš vyhodit.
InnoDB umí pracovat s cizími klíči. Když jsem se já učil Nette, taky
jsem taky používal MyISAM (to zase umí něco jinýho, jen jsem zapomněl co
:-)). Po 2 dnech zjišťování, proč mě nefungujou konstrukce typu
$project->foto->name
, jsem zjistil, že to je tím, že
používám MyISAM…
InnoDB, pokud nepoužíváš kvuli nějakému důvodu MyISAM je IMHO lepší volbou :-)