我有3个模型,例如;
TABLE `users`
`id` INT
`username` VARCHAR(32)
...
TABLE `books`
`id` INT
`title` VARCHAR(100)
`author` INT (foreign ket constraint)
TABLE `rights`
`id` INT
`name` VARCHAR(32)现在我想要一个用户有特殊的权利,例如。阅读或编辑书籍。因此,权限表应该类似于(非常类似于ORM角色表):
|----|------|
| id | name |
|----|------|
| 1 | view |
| 2 | edit |
| .. | ... |我会有第四张桌子把这三个连接起来;
TABLE user_book_rights
|---------|---------|----------|
| user_id | book_id | right_id |
|---------|---------|----------|
| 1 | 1 | 2 |
| 1 | 2 | 1 |
| 2 | 1 | 1 |
| ... | ... | ... |因此,如果用户想要,比如说,阅读一本书,我想检查id为1的登录用户是否拥有id为2的书的id为1的权限。
但是我该如何用ORM来实现这一点呢?当然,我可以只编写自己的查询;
SELECT COUNT(*) as `has_right` FROM `user_book_rights` WHERE user_id=1 AND book_id=2 AND right_id=1
if($result['has_right']) {
echo 'Yeah, read the book!';
} else {
echo 'Sorry mate, this book is not for dummies...';
}但我更愿意这样做:
$has_right = $user->has('book_rights', ORM::factory('user_book_right', array('book_id' => '2', 'right_id' => 1));或者更好:
$book = ORM::factory('book', 1);
$right = ORM::factory('right', array('name' => 'view'));
$has_right = $user->has('book_rights', ORM::factory('user_book_right', array($book, $right)));我找不到我的问题的答案。想要将三个模型链接为many_through关系是不是很奇怪?或者是ORM没有能力,我应该写我自己的查询吗?
谢谢。为了你的洞察力!
发布于 2011-10-04 17:04:46
也许我的回答对你帮助不大。但我建议您以位表示形式编码正确的内容。
READ = 00000001 = 1
EDIT = 00000010 = 2
DELETE = 0000100 = 4然后,如果用户有读取、编辑和删除的写入权限,您只需执行以下操作
READ | EDIT | DELETE = 0000111 = 7如果你想测试一个用户是否有特定的权限,你只需这样做: If ($user_write & READ) { //他可以读取}
也许如果你使用这种设计,去掉那些常量的权限表,它可能会对你有帮助。
https://stackoverflow.com/questions/7626902
复制相似问题