Related vrací Cannot read an undeclared column „id“

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

Ahoj,

snažím se získat uživatelské role z M:N vazby.

Mám dotaz

$row = $this->getDatabase()->table('user')->select('user.name, user.surname')->where(':user_contacts.user_contact_type.id', 1)->where(':user_contacts.value', $email)->where('SHA2(CONCAT(:user_credentials.salt, ?), 512) = :user_credentials.password', $password);

A pak bych z row rád vytáhnul jeho role něco jako

$row->fetch()->related(':user_roles.roles')->select('name');

(tim si nejsem jistý, teprve se s \Nette\Database seznamuji) ale pořád mi to vrací výjimku Cannot read an undeclared column „id“

Schéma SQL vypadá následovně

CREATE TABLE `role` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `user` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `surname` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `user_contact_type` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `description` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `user_contacts` (
  `user_id` int(10) NOT NULL,
  `user_contact_type_id` int(10) NOT NULL,
  `value` varchar(255) NOT NULL,
  PRIMARY KEY (`user_id`,`user_contact_type_id`),
  KEY `user_id` (`user_id`),
  KEY `user_contact_type_id` (`user_contact_type_id`),
  CONSTRAINT `user_contacts_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`),
  CONSTRAINT `user_contacts_ibfk_2` FOREIGN KEY (`user_contact_type_id`) REFERENCES `user_contact_type` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `user_credentials` (
  `user_id` int(10) NOT NULL,
  `salt` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  PRIMARY KEY (`user_id`),
  KEY `user_id` (`user_id`),
  CONSTRAINT `user_credentials_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `user_roles` (
  `user_id` int(10) NOT NULL,
  `role_id` int(10) NOT NULL,
  UNIQUE KEY `user_id_role_id` (`user_id`,`role_id`),
  KEY `role_id` (`role_id`),
  CONSTRAINT `user_roles_ibfk_2` FOREIGN KEY (`role_id`) REFERENCES `role` (`id`),
  CONSTRAINT `user_roles_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Dovedli byste poradit, jak získat role?

David Matějka
Moderator | 6445
+
0
-

zkus

$row->fetch()->related('user_roles')->select('role.name');
2bfree
Člen | 248
+
0
-

matej21 napsal(a):

zkus

$row->fetch()->related('user_roles')->select('role.name');

Stejný problém Cannot read an undeclared column „id“. I jsem zkusil vymazat cache a mic ;(

2bfree
Člen | 248
+
0
-

Tak jo, problém je v tom, že v tom $row už byl použit ->select(), který tomu celému zamezí. ;(

2bfree
Člen | 248
+
0
-

jen teď řeším, že mi to vrací vice než chci.

když si tedy vytáhnu data dotazem

$row = $this->getDatabase()->table('user')->where(':user_contacts.user_contact_type.id', 1)->where(':user_contacts.value', $email)->where('SHA2(CONCAT(:user_credentials.salt, ?), 512) = :user_credentials.password', $password);

a pak chci vytahnout jen role, tak si zavolam

dump(current($row->fetch()->related('role')->select('role.name')->fetchAll())->toArray());

Jenže ve výstupních datech se mi nezobrazí jen sloupeček name, jak bych očekával, ale je tam vidět i user_id. Existuje nějaká rozumná cesta, jak takto získat pole s názvama rolí?

David Matějka
Moderator | 6445
+
0
-

zkus

$row->fetch()->related('role')->select('role.name')->fetchPairs(NULL, 'name');
2bfree
Člen | 248
+
0
-

matej21 napsal(a):

zkus

$row->fetch()->related('role')->select('role.name')->fetchPairs(NULL, 'name');

Paráda, díky moc. To je přesně co jsem potřeboval.

2bfree
Člen | 248
+
0
-

Tak ještě přidám zkušenost, že ->related() se dá zavolat do té doby, dokud se na tom zdroji nezavolá ->select()

// Tohle funguje
$roles = $row->fetch()->related('role')->select('role.name')->fetchPairs(NULL, 'name');
$userId = $row->select('user.id')->fetch()->id;
// Tohle nefunguje
$userId = $row->select('user.id')->fetch()->id;
$roles = $row->fetch()->related('role')->select('role.name')->fetchPairs(NULL, 'name');