有没有更聪明的方法来加载PHP和MySQL的多对多关系?

时间:2013-09-16 16:31:03

标签: php mysql many-to-many

假设您在多对多关系中拥有UsersRoles。标准设置包含以下表格:

user            role           user_role
  user_id         role_id        user_id
  email           name           role_id

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


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

  1. 获取具有组连接角色ID的所有用户。
  2. 在单独的查询中获取所有角色名称
  3. 循环访问用户,展开角色ID并将其与角色查询中的名称连接起来。
  4. 任何好/更好/更有效/更清洁/更快的替代品?在单个查询中执行此操作的任何好方法?

1 个答案:

答案 0 :(得分: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);
?>

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