Nefunkční sloučení dvou tabulek

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

Dobrý den, chtěl bych vás poprosit o pomoc, proč nefunguje toto sločení dvou tabulek? Hází mi to chybu: No reference found for $product->volume

$products = $this->database->table('product')
			->where('volume.product_id','product.id');

CREATE TABLE `product` (
  `id` int(10) UNSIGNED NOT NULL,
  `name` varchar(255) COLLATE utf8_czech_ci NOT NULL DEFAULT '',
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;


CREATE TABLE `volume` (
  `volume_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
  `product_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

Editoval vibko (30. 7. 2016 14:19)

potapnik
Člen | 127
+
0
-

Nemáš tam zadefinované FOREIGN KEYs, navíc to máš v MyISAM enginu, který ani foreign keys nepodporuje. Přehoď to na InnoDB a nastuduj si, jak ty cizí klíče fungují.

GEpic
Člen | 566
+
+1
-

Navíc i k té struktuře, v tabulce volume nepotřebuješ sloupec volume_id … nejspíš si chtěl přímo sloupec id. Primární klíče jsou vždy AI (Auto increment) kvůli zajištění unikátního číslování. Stejně tak nemůžeš do sloupec product_id napsat hodnotu, pokud neexistuje v tabulce product ve sloupci id. To by pak ztratilo význam, je však možné mít v referenčních sloupcích hodnotu NULL, ale to je tak rare use-case že bych se tomu radši vyhýbal, pokud není potřeba (a neměla by být v dobře navržených databázích).

PS:

CREATE TABLE IF NOT EXISTS `product` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_czech_ci NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

CREATE TABLE IF NOT EXISTS `volume` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `product_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `product_id` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

ALTER TABLE `volume`
  ADD CONSTRAINT `volume_ibfk_1` FOREIGN KEY (`product_id`) REFERENCES `product` (`id`);

Editoval GEpic (30. 7. 2016 22:56)

vibko
Člen | 43
+
0
-

Děkuji moc za rady, velmi mi pomohli