Insert do vazební tabulky hlásí chybu, proč?
- iceover
- Člen | 10
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)
- iceover
- Člen | 10
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
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
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
@iceover uz je dokonce kapitola i v ofic dokumentaci, viz https://doc.nette.org/…dependencies