【问题标题】:How can I build a 'has-many-through' relation linking more than 2 models?如何建立链接超过 2 个模型的“具有多通性”关系?
【发布时间】:2011-11-29 10:13:28
【问题描述】:

我有 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 为 1 的书阅读 id 为 2 的书。

但是我怎么能用 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 只是没有能力,我应该编写自己的查询吗?

谢谢你。为您提供见解!

【问题讨论】:

  • 也许看看像 Doctrine 这样流行的 ORM 如何处理这些情况会有所帮助? doctrine-project.org/docs/orm/2.1/en/reference/…
  • 我认为 3.2 是不可能的(至少默认情况下不会)。 3.3 可能会支持这个。
  • hmzz...太糟糕了...现在我将通过自己编写查询来解决这个问题。当我在这个项目之后找到一些时间时,我可能会分叉我自己的实现!谢谢你们的建议!

标签: php orm kohana has-many-through


【解决方案1】:

也许我的回答对你帮助不大。但我建议您以位表示形式对权利进行编码。

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

如果用户有读取、编辑和删除的写入权限 你只是这样做

READ | EDIT | DELETE = 0000111 = 7

如果您想测试用户是否具有特定权利,您只需执行以下操作: if ($user_write & READ) { // 他可以阅读}

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

【讨论】:

  • oldskool unix :) 这是一个很好的解决方案,唯一的缺点是我无法将一些关于权限的元数据保存到表中(或者我应该创建一个表来插入位权限,但这会让我遇到同样的问题;))
猜你喜欢
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 2019-10-03
  • 1970-01-01
相关资源
最近更新 更多