Nette\Database\Reflection\MissingReferenceException při obyčejném joinu

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

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

pri „to one“ neni dulezity nazev cilove tabulky, ale nazev spojovaciho sloupce (resp. jeho cast), takze:

->where('stat.id_user = ?', ...)
hrach
Člen | 1838
+
-2
-

diky @matej21 za vyreseni, samozrejme, kdyby sis precetl dokumentaci, tak to vis.

Izzy
Člen | 5
+
+2
-

Děkuji mnohokrát @matej21, už mi to funguje.
Dokumentaci jsem četl, nicméně že to funguje takhle jsem z toho tak úplně nepochopil, moje chyba.

hrach
Člen | 1838
+
0
-

@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');
Izzy
Člen | 5
+
0
-

Neříkám, že to je napsané špatně, jen že jsem to já moc nepochopil když jsem to četl. To neznačí nic o špatně napsaném textu jako spíše o mojí blbosti – respektive nepozornosti. Každopádně problém je vyřešen, já vám děkuji za pomoc a příště se polepším :)

David Matějka
Moderator | 6445
+
0
-

@hrach mozna by stacilo dat tucne „odvozen od jména sloupce“ a pridat tam, ze nazev tabulky neni dulezity

hrach
Člen | 1838
+
0
-

@Izzy ale ja ti nechci nic vycitat, jak chci vylepsit text, abys to (/nekdo jako ty) priste pochopil :-)