Nette database – Column not found

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

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

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

Pouzivas MyISAM, takze bys musel dodrzovat konvence, ty jsou defaultne takhle (zkracene):

  1. primarni klic „id“
  2. „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
+
0
-

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');
David Matějka
Moderator | 6445
+
0
-

Nejdriv mi rekni, co chces vlastne vybrat..

Taps
Člen | 168
+
0
-

matej21
Chci vybrat fotky, které jsou přiřazeny danému projektu a mají v tabulce foto ve sloupci uvodni hodnotu 1

Oli
Člen | 1215
+
0
-

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

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

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

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

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 :-)

Taps
Člen | 168
+
0
-

Rád, bych to vyhodil ale v níže uvedeném původním zápise to nikde nevidím. Vypadá jak kdyby se to vygenerovalo automaticky

return $this->connection->table('projekty')
                       ->where('foto.id_projektu= ?', 'id_projektu')
                       ->where ('foto.uvodni=1');
Oli
Člen | 1215
+
0
-

Podle mě se jedná o ten prostřední řádek. Když ho odstraníš, tak by ti to mělo fungovat pořád stejně. Protože to je spojené pomocí foto.id_projektu a projekt.id.

Taps
Člen | 168
+
0
-

Díky vyzkouším