假设您在多对多关系中拥有Users
和Roles
。标准设置包含以下表格:
user role user_role
user_id role_id user_id
email name role_id
最好使用尽可能少的查询,用所有属于它们的标签加载所有用户的好方法是什么?也就是说,我想最终得到用户,每个用户都有一系列角色。
我目前正在考虑使用以下内容,这需要两次查询。
任何好/更好/更有效/更清洁/更快的替代品?在单个查询中执行此操作的任何好方法?
答案 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);
?>
以上假设所有用户至少有一个角色。如果没有,请使用外连接。