【问题标题】:cakephp query with multiple joins具有多个连接的 cakephp 查询
【发布时间】:2026-02-14 13:05:03
【问题描述】:

我想知道是否有更好的方法来实现这一点:

$rights = $this->User->Role->Right->query(
    "SELECT ri.*
    FROM rights AS ri 
    LEFT JOIN roles_rights AS rr ON rr.right_id = ri.id 
    LEFT JOIN users_roles AS ur ON ur.role_id = rr.role_id
    WHERE ur.user_id = " . Sanitize::clean($user['User']['id']));

我希望有更好的方法来获取特定用户的所有权利。

我想通过 $this->User->... 访问权限,这可能吗?

一个用户有一个或多个角色,一个角色有一个或多个权限。

【问题讨论】:

    标签: mysql cakephp cakephp-2.0


    【解决方案1】:

    试着把它翻过来:

    $rights = $this->User->Role->Right->query(
      SELECT ri.* 
      FROM users_roles AS ur
      INNER JOIN roles_rights AS rr ON rr.role_id = ur.role_id
      INNER JOIN rights ri ON ri.id = rr.right_id
      WHERE ur.user_id = Sanitize::clean($user['User']['id']));
    

    【讨论】:

    • 好处在哪里?我想通过模型访问权限。我不能获取 User 的实例并执行类似的操作:$rights = $User->Role->Right->find('list'); 吗?
    • ok :) 但是 JOIN 语句的顺序影响不会太大吧?
    • 通过您的方法,您加入所有权利、所有角色和所有用户(即使由于左加入而没有关系),然后您过滤掉您想要的用户。用我的方法,您只需选择您想要的用户并仅加入该行。但话又说回来,数据库服务器可能很聪明并优化查询,因此结果基本相同。在这种情况下,您只剩下一个更易于阅读的查询。 (内连接总是更容易左连接..)
    • 好的,谢谢,只要找不到 cakephp 方法,我就会使用您的查询