Insert do vazební tabulky hlásí chybu, proč?

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

Zdravím, pokud vložím řádek do vazební tabulky, takto:

<?php

$connection = $this->context->database;
$this->database = new Context($connection);

$tableVideoTag = $this->database->table('video_tag');
$tableVideoTag->insert(array('video_id' => 1, 'tag_id' => 1));

Struktura tabulky:

CREATE TABLE `video_tag` (
  `video_id` int(11) NOT NULL,
  `tag_id` int(11) NOT NULL,
  PRIMARY KEY (`video_id`,`tag_id`),
  KEY `tag_id` (`tag_id`),
  CONSTRAINT `video_tag_ibfk_2` FOREIGN KEY (`tag_id`) REFERENCES `tag` (`id`) ON DELETE CASCADE,
  CONSTRAINT `video_tag_ibfk_1` FOREIGN KEY (`video_id`) REFERENCES `video` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;


?>

tak se data správně uloží, ale laděnka mi hlásí chybu:

SQLSTATE[42S22]: Column not found: 1054 Unknown column ‚video_tag.id‘ in ‚where clause‘

Queries:

<?php
INSERT INTO `video_tag` (`video_id`, `tag_id`) VALUES (1, 1)
.../vendor/nette/utils/src/Utils/ObjectMixin.php:63	1
ERROR
SELECT * FROM `video_tag` WHERE (`video_tag`.`id` = '0')
.../vendor/nette/database/src/Database/ResultSet.php:68

?>

Pokud do vazební tabulky přidám sloupec id, tak insert proběhne v pořádku. Napadlo mě, že by to mohlo způsobovat to, že hledá neexistující id vloženého záznamu. Nevím, jestli něco dělám špatně nebo se jedná o chybu? Každopádně děkuji za odpověď.

Editoval iceover (12. 9. 2014 14:22)

David Matějka
Moderator | 6445
+
0
-

pouzivas discovered reflection? (je defaultni)

iceover
Člen | 10
+
0
-

Ano používám.

config neon:

<?php

database:
		dsn: 'mysql:host=localhost;dbname=table_name'
		user: 'user'
		password: 'pass'
		options: [PDO::MYSQL_ATTR_COMPRESS = true]
		debugger: true
		explain: true
		reflection: discovered
		autowired:  true

?>

Editoval iceover (12. 9. 2014 14:31)

Mysteria
Člen | 797
+
0
-

Osobně bych viděl problém v tom, že máš PK složený ze dvou sloupců. Nejsem si jist, jestli s tím NDBT umí korektně pracovat.

iceover
Člen | 10
+
0
-

To mě taky napadlo, ale tím to není. Chyba je stejná i pro tuto tabulku:

CREATE TABLE `video_tag` (
  `video_id` int(11) NOT NULL,
  `tag_id` int(11) NOT NULL,
  KEY `tag_id` (`tag_id`),
  KEY `video_id` (`video_id`),
  CONSTRAINT `video_tag_ibfk_1` FOREIGN KEY (`video_id`) REFERENCES `video` (`id`) ON DELETE CASCADE,
  CONSTRAINT `video_tag_ibfk_2` FOREIGN KEY (`tag_id`) REFERENCES `tag` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
David Matějka
Moderator | 6445
+
+1
-

az ted jsem si toho vsimnul
nevytvarej context rucne! injectni si ho.. Kdyz ho vytvoris takhle, tak to pouzije prave onu conventional reflection

Editoval matej21 (12. 9. 2014 15:29)

iceover
Člen | 10
+
0
-

Do BasePresenteru jsem přidal:

public function injectContext(Nette\Database\Context $context) {
	if ($this->database)
		throw new Nette\InvalidStateException('Context has already been set');

	$this->database = $context;
}

a vše funguje, tak jak má. Moc děkuju. To pojmenování $this->database asi není zrovna ideální, ale $this->context mi zase přišlo matoucí, tak nevím. Taky bych chtěl poděkovat za tento článek moc mi pomohl.

David Matějka
Moderator | 6445
+
0
-

@iceover uz je dokonce kapitola i v ofic dokumentaci, viz https://doc.nette.org/…dependencies