2017-02-06 31 views
2

我有这个PHP函数的问题,我试图用他的角色和组获取用户,它的角色工作良好,但我有组的问题,因为我得到相同的数组组,当然我想要的是重复的自由数组。我明白为什么我得到这个,因为我的用户有2个角色,我让他在SQL查询2次,谁能解释我什么是最佳实践,以及如何避免这种情况,我应该使用这样的查询,或者我可以使用另一种查询在哪里我会找到所有组的成员,然后把它放在该数组中,但这是2个DB调用一个函数,它可能不是那么好的解决方案。从多个到多个PHP获取

function getAll($mysqli) { 
    $stmt = $mysqli->prepare("SELECT u.id, u.firstName, u.lastName, u.email, 
     u.phoneNumber, u.address, u.birthDate, ur.roleName, cg.id, cg.name FROM users as u 
     LEFT OUTER JOIN user_role as ur ON u.id = ur.userId 
     LEFT OUTER JOIN user_group as ug on ug.userId = u.id 
     LEFT OUTER JOIN control_group as cg on cg.id = ug.groupId"); 

    $stmt->execute(); 
    $stmt->bind_result($id, $firstName, $lastName, $email, $phoneNumber, 
     $address, $birthDate, $roleName, $groupId, $groupName); 
    $users = array(); 

    while ($stmt->fetch()) { 
     if (empty($users[$id])) { 
      $users[$id] = array(
       'id' => $id, 
       'firstName' => $firstName, 
       'lastName' => $lastName, 
       'email' => $email, 
       'phoneNumber' => $phoneNumber, 
       'address' => $address, 
       'birthDate' => $birthDate, 
       'roles' => array(), 
       'groups' => array() 
      ); 
     } 
     if ($roleName) { 
      $users[$id]['roles'][] = array(
       'roleName' => $roleName 
      ); 
     } 
     if ($groupId) { 
      $users[$id]['groups'][] = array(
       'groupName' => $groupName 
      ); 
     } 
    } 

    $stmt->close(); 
    $mysqli->close();; 
    echo json_encode($users); 
} 

当我执行该功能我得到这样

{ 
    "1":{ 
     "id":1, 
     "firstName":"John", 
     "lastName":"Doe", 
     "email":"[email protected]", 
     "phoneNumber":"062-441234-123123", 
     "address":"Some Address 40\/2", 
     "birthDate":"1989-12-29", 
     "roles":[ 
     { 
      "roleName":"Admin" 
     }, 
     { 
      "roleName":"User" 
     } 
     ], 
     "groups":[ 
     { 
      "groupName":"Group 1" 
     }, 
     { 
      "groupName":"Group 1" 
     } 
     ] 
    }, 
    "2":{ 
     "id":2, 
     "firstName":"Jane", 
     "lastName":"Doe", 
     "email":"[email protected]", 
     "phoneNumber":"0112-11121-221322", 
     "address":"Address 21ca", 
     "birthDate":"1975-12-28", 
     "roles":[ 
     { 
      "roleName":"Admin" 
     }, 
     { 
      "roleName":"User" 
     } 
     ], 
     "groups":[ 

     ] 
    } 
} 

回答

1

响应您可以检查是否一个角色(或一组)在数组中插入之前已经存在:

if ($roleName) { 
    $found = false; 
    foreach ($users[$id]['roles'] as $role) { 
     if($role['roleName'] == $roleName){ 
      $found = true; 
      break; 
     } 
    } 
    if($found == false) 
     $users[$id]['roles'][] = array(
      'roleName' => $roleName 
     ); 
} 

注意我给你一个基于你的结构的答案。但我强烈建议改变阵列的结构,以检查角色的存在是否快速O(1)

编辑:为了完成我的答案:我会说JSON结构不反映什么真实的情况是。您声明用户具有角色和组,但这是真实的,但角色属于该组。用户可以在第1组的管理员和任何在第2组这就是为什么我认为你应该输出什么是这样的:

{ 
    "1":{ 
     "id":1, 
     "firstName":"John", 
     "lastName":"Doe", 
     "email":"[email protected]", 
     "phoneNumber":"062-441234-123123", 
     "address":"Some Address 40\/2", 
     "birthDate":"1989-12-29", 
     "groups":[ 
     { 
      "groupName": "Group 1", 
      "roles": [ 
       { 
        "roleName":"Admin" 
       }, 
       { 
        "roleName":"User" 
       } 
      ] 
     } 

     ] 
    }, 
    "2":{ 
     "id":2, 
     "firstName":"Jane", 
     "lastName":"Doe", 
     "email":"[email protected]", 
     "phoneNumber":"0112-11121-221322", 
     "address":"Address 21ca", 
     "birthDate":"1975-12-28", 
     "groups":[ 

     ] 
    } 
} 
+0

角色都工作正常,我有问题同组,即时知道为什么群体不像角色一样工作其基本相同的情况 –

+0

如果你有一个用户在不同的组中具有相同的角色,它将无法工作。试试吧,你会看到它是如何被复制的。 – barbarity

+0

另外,如果你想我的诚实的意见......只有通过我可以看看,我感觉数据库没有反映你的业务逻辑或JSON的结构不(或两者兼而有之)。 – barbarity