首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何建立一个连接2个以上模型的“多通道”关系?

如何建立一个连接2个以上模型的“多通道”关系?
EN

Stack Overflow用户
提问于 2011-10-02 22:20:02
回答 1查看 699关注 0票数 3

我有3个模型,例如;

代码语言:javascript
复制
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角色表):

代码语言:javascript
复制
|----|------|
| id | name |
|----|------|
| 1  | view |
| 2  | edit |
| .. | ...  |

我会有第四张桌子把这三个连接起来;

代码语言:javascript
复制
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来实现这一点呢?当然,我可以只编写自己的查询;

代码语言:javascript
复制
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...';
}

但我更愿意这样做:

代码语言:javascript
复制
$has_right = $user->has('book_rights', ORM::factory('user_book_right', array('book_id' => '2', 'right_id' => 1));

或者更好:

代码语言:javascript
复制
$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没有能力,我应该写我自己的查询吗?

谢谢。为了你的洞察力!

EN

回答 1

Stack Overflow用户

发布于 2011-10-04 17:04:46

也许我的回答对你帮助不大。但我建议您以位表示形式编码正确的内容。

代码语言:javascript
复制
READ = 00000001 = 1
EDIT = 00000010 = 2
DELETE = 0000100 = 4

然后,如果用户有读取、编辑和删除的写入权限,您只需执行以下操作

代码语言:javascript
复制
READ | EDIT | DELETE = 0000111 = 7

如果你想测试一个用户是否有特定的权限,你只需这样做: If ($user_write & READ) { //他可以读取}

也许如果你使用这种设计,去掉那些常量的权限表,它可能会对你有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7626902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档