Nette\Database\Reflection\MissingReferenceException při obyčejném joinu
- Izzy
- Člen | 5
Zdravím,
mám problém s Nette\Database. Nefunguje mi úplně obyčejný join u jedné
sady tabulek, zatímco u druhé funguje bez problému. Opravdu už nevím, kde
může být chyba. Tabulky vypadají takto:
/*Table structure for table `photo_stats` */
CREATE TABLE `photo_stats` (
`id_photo` int(10) unsigned NOT NULL,
`id_stat` int(10) unsigned NOT NULL,
PRIMARY KEY (`id_photo`,`id_stat`),
KEY `id_stat` (`id_stat`),
CONSTRAINT `photo_stats_ibfk_1` FOREIGN KEY (`id_photo`) REFERENCES `photo` (`id_photo`) ON DELETE CASCADE,
CONSTRAINT `photo_stats_ibfk_2` FOREIGN KEY (`id_stat`) REFERENCES `user_stats` (`id_stat`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*Table structure for table `photo` */
CREATE TABLE `photo` (
`id_photo` int(10) unsigned NOT NULL AUTO_INCREMENT,
`id_user` int(10) unsigned NOT NULL,
`filename` varchar(100) NOT NULL,
`extension` varchar(5) NOT NULL,
`description` text,
`date` datetime NOT NULL,
PRIMARY KEY (`id_photo`),
KEY `id_user` (`id_user`),
CONSTRAINT `photo_ibfk_1` FOREIGN KEY (`id_user`) REFERENCES `user` (`id_user`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=123 DEFAULT CHARSET=utf8;
/*Table structure for table `user_stats` */
CREATE TABLE `user_stats` (
`id_stat` int(10) unsigned NOT NULL AUTO_INCREMENT,
`id_type` int(10) unsigned NOT NULL,
`id_user` int(10) unsigned NOT NULL,
`date` date DEFAULT NULL,
`value` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id_stat`),
KEY `user_stats_FKIndex1` (`id_user`),
KEY `user_stats_FKIndex2` (`id_type`),
CONSTRAINT `user_stats_ibfk_1` FOREIGN KEY (`id_user`) REFERENCES `user` (`id_user`) ON DELETE CASCADE ON UPDATE NO ACTION,
CONSTRAINT `user_stats_ibfk_2` FOREIGN KEY (`id_type`) REFERENCES `stats_type` (`id_type`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8;
A kód takto:
//model
public function GetStatsPhotos($user)
{
return $this->getTable('photo_stats')->where('user_stats.id_user = ?', $user->id);
}
//presenter
$result = $this->photosModel->GetStatsPhotos($this->user);
Problém je v tom, že takto mi to vyhazuje výjimku (třeba při
dump($result->count())
)
Nette\Database\Reflection\MissingReferenceException
No reference found for $photo_stats->user_stats.
Přitom jak je vidět, tak cizí klíče definované jsou správně. Navíc
když jsem zkusil smazat WHERE podmínku a po fetch() přistoupit na
$result->photo tak to ukázalo správně, ale při $result->user_stats už
zase ne.
A co je ještě divnější, tak úplně stejně si to spojuji tabulky
photo_meal a meal, kde struktura je v podstatě totožná a
tady to jede v pohodě. Díval jsem se i do
information_schema.key_column_usage a tady vypadají záznamy stejně
pro tabulky týkající se jídla (meal) a pro tabulky týkající se
statistik (user_stats).
Opravdu budu vděčný za každou radu, protože já už nevím.
- David Matějka
- Moderator | 6445
pri „to one“ neni dulezity nazev cilove tabulky, ale nazev spojovaciho sloupce (resp. jeho cast), takze:
->where('stat.id_user = ?', ...)
- hrach
- Člen | 1838
@Izzy Jak prosím vylepšit toto, abys to pochopil – jako vážně… ;)
Řekněme, že chceme vybrat všechny knihy, které napsal autor jménem „Jon“. Musíme napsat pouze jméno „spojovacího klíče“ relace a název sloupce spojené tabulky. „Spojovací klíč“ je odvozen od jména sloupce, který odkazuje na tabulku, se kterou se chceme spojit. V našem příkladu (viz databázové schéma) je to sloupec author_id, ze kterého stačí použít část – author. name je název sloupce v tabulce author. Můžeme vytvořit podmínku také pro překladatele knihy, který je připojen sloupcem translator_id.
$selection = $context->table('book'); $selection->where('author.name LIKE ?', '%Jon%'); $selection->where('translator.name', 'David Grudl');
- David Matějka
- Moderator | 6445
@hrach mozna by stacilo dat tucne „odvozen od jména sloupce“ a pridat tam, ze nazev tabulky neni dulezity