Cizí klíč jako string – nefunkční ref?
- Jarek92
- Člen | 91
Zdravím,
narazil jsem na následující problém:
V aplikaci jsem zvyklý přistupovat k relacím v DB tabulce následovně,
např. $neco->jinaTabulka. Toto mi vždy vrátí instanci ActiveRow,
nicméně v případě, že mám v tabulce „role“ nastaven primární
klíč jako string (bez AI), tak i přes to, že mám nastavený cizí klíč
tak jako obvykle, tak mi zápis: $privilege->role
vyhodí
následující chybu:
Argument 1 passed to Model\Entities\Services\RoleService::loadFromDb() must be an instance of Nette\Database\Table\ActiveRow, string given, called in C:\localhost\htdocs\sportwin\app\model\entities\services\PrivilegeService.php on line 13 and defined
Takže $privilege->role
chápe jako string a ne jako odkaz na
další tabulku. Setkal se s tím už někdo?
Struktura tabulek:
CREATE TABLE `privilege` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`role` varchar(30) COLLATE utf8_czech_ci NOT NULL,
`resource_id` int(11) DEFAULT NULL,
`allowed` tinyint(1) NOT NULL,
PRIMARY KEY (`id`),
KEY `resource_id` (`resource_id`),
KEY `role` (`role`),
CONSTRAINT `privilege_ibfk_2` FOREIGN KEY (`resource_id`) REFERENCES `resource` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `privilege_ibfk_4` FOREIGN KEY (`role`) REFERENCES `role` (`name`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
CREATE TABLE `resource` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(200) COLLATE utf8_czech_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
CREATE TABLE `role` (
`name` varchar(30) COLLATE utf8_czech_ci NOT NULL,
`parent` varchar(30) COLLATE utf8_czech_ci DEFAULT NULL,
`rank` smallint(6) NOT NULL,
PRIMARY KEY (`name`),
KEY `parent` (`parent`),
CONSTRAINT `role_ibfk_1` FOREIGN KEY (`parent`) REFERENCES `role` (`name`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
- David Matějka
- Moderator | 6445
Tohle je ocekavane chovani, pokud existuje sloupecek, tak to vraci jeho hodnotu. az pokud to nenajde sloupecek, tak hleda nejaky FK.
muzes pouzit treba $privilege->ref('role')
, cimz explicitne
uvedes, ze chces relaci a ne hodnotu. Pripadne kdybys pojmenoval ten sloupecek
napriklad role_ref
nebo tak nejak, tak
$privilege->role
bude fungovat