0

假设你有Users一个Roles多对多的关系。带有下表的标准设置:

user            role           user_role
  user_id         role_id        user_id
  email           name           role_id

最好用尽可能少的查询,用属于他们的所有标签加载所有用户的好方法是什么?也就是说,我想最终得到用户,每个用户都有一系列角色。


我目前正在考虑使用以下内容,这需要两个查询。

  1. 获取具有组级联角色 ID 的所有用户。
  2. 在单独的查询中获取所有角色名称
  3. 遍历用户,分解角色 ID,并将它们与角色查询中的名称连接起来。

有什么好的/更好/更高效/更清洁/更快的替代品吗?在单个查询中执行此操作的任何好方法?

4

1 回答 1

1

返回所有用户的所有角色

<?php
    $array=array();
    $sql='SELECT user.email,role.name
    FROM user
    INNER JOIN user_role ON user_role.user_id=user.user_id
    INNER JOIN role ON user_role.role_id=role.role_id';

    $stmt = db::db()->query($sql);
    while($row=$stmt->fetch(PDO::FETCH_ASSOC))
    {
        if (!isset($array[$row['email']])){$array[$row['email']]=array();}
        array[$row['email']][]=$row['name'];
    }

?>

返回单个用户的所有角色

<?php
    $sql='SELECT user.email,role.name
    FROM user
    INNER JOIN user_role ON user_role.user_id=user.user_id
    INNER JOIN role ON user_role.role_id=role.role_id
    WHERE user.email=?';

    $stmt = db::db()->prepare($sql);
    $stmt->execute(array('anEmail@domain.com'));
    $roles=$stmt->fetchAll(PDO::FETCH_ASSOC);
?>

以上假设所有用户都至少有一个角色。如果没有,请使用外连接。

于 2013-09-16T16:34:47.980 回答