Cizí klíč jako string – nefunkční ref?

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

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

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

Jarek92
Člen | 91
+
0
-

Díky, $privilege->ref(„role“) funguje, nicméně, pokud přejmenuji sloupec role na role_name v tabulce privilege, tak při $privilege->role nette vyhodí výjimku:

Nette\MemberAccessException

Cannot read an undeclared column ‚role‘

To mě právě zmátlo.

David Grudl
Nette Core | 8228
+
+2
-

BTW, po každé změně databáze je potřeba smazat cache.

Jarek92
Člen | 91
+
0
-

Děkuju moc :) to mě nenapadlo.