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
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?
- 2bfree
- Člen | 248
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
zkus
$row->fetch()->related('role')->select('role.name')->fetchPairs(NULL, 'name');
- 2bfree
- Člen | 248
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');