如何构建链接超过2个模型的“多次通过”关系?

时间:2011-10-02 14:20:02

标签: php orm kohana has-many-through

我有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)));

我无法找到问题的答案。想要将三个模型链接为多个实际关系是否奇怪?或者ORM不具备能力,我应该编写自己的查询吗?

谢谢你。为了你的见解!

1 个答案:

答案 0 :(得分:1)

也许我的回答对你没什么帮助。但我建议您在位表示中编码右侧。

READ = 00000001 = 1
EDIT = 00000010 = 2
DELETE = 0000100 = 4

,如果用户具有读取,编辑和删除的写入 你刚才做的

READ | EDIT | DELETE = 0000111 = 7

如果您想测试用户是否具有特定权限,您只需: if($ user_write& READ){//他能读懂}

也许如果您使用此设计,并删除包含这些常量的权限表,它可能会对您有所帮助。