如何从数据库向现有对象数组添加信息?

问题描述 投票:2回答:3

我有以下格式的数组;

// echo '<pre>' . var_export($this->viewableFields, true) . '</pre>';

array (
  0 => 
  (object) array(
     'formId' => '4',
     'userId' => '7'
  ),
  1 => 
  (object) array(
     'formId' => '4',
     'userId' => '4'
  )
) 

我需要修改数据并向此数组添加另一个键/值。我需要使用数组中的userId值,查询一个MySQL数据库并返回该值。我需要对每个数组元素执行此操作。

因此,对于每个数组元素,我都想运行类似的查询;

从用户的SELECT组中,用户ID = [数组中的用户ID]

然后我要将这个值添加到数组中,最终的数组应该看起来像这样;

array (
  0 => 
  (object) array(
     'formId' => '4',
     'userId' => '7',
     'group' => 'Registered'
  ),
  1 => 
  (object) array(
     'formId' => '4',
     'userId' => '4',
     'group' => 'Admin'
  )
) 

我知道我可以通过使用array_walk向数组元素添加一个附加值;

array_walk($this->viewableFields, function(&$arr) {
    $arr->group = 'Registered';
});

我不确定如何从数据库中检索值并将其插入现有数组。

我该如何实现?

php mysql arrays
3个回答
0
投票

首先,我们将从对象数组中获取userID的值,然后在数据库中查询它,假设数组为$ arr。

foreach($arr AS $key=>$item) 
{
    $userid=$item["userId"];  // getting userId from object
    $query= $con->query("SELECT group from users WHERE userId='$userid'");
    if($query->num_rows>0)  //checking if query has some result
    {
        $row=$result->fetch_assoc();      //fetching the result
        $arr[$key]->group=$row['group'];  // lastly attaching group key to the arr.
    }
}

0
投票

对每条记录进行一次额外的查询是一个非常糟糕的主意,也是N + 1问题]的一个清晰示例:您需要获取实体的“ N”个子代,其中只有父实体最初被获取]]。

如果您的初始查询有100个用户,则最终将进行101个查询。如果您以后需要其他不相关的字段,则该字段很快就会变得不可收拾。

这对性能非常不利,并且随着应用程序复杂性的增加,很容易对应用程序产生非常严重的影响。

假设您不能修改初始查询并进行简单的JOIN查询来获取所需的数据,最好简单地进行两个查询并缝合结果数据。即使您可以修改原始查询,也可能最终获得更好的效果。

如何进行:

假设您拥有具有formIduserId公共属性的初始对象数组,首先获取您感兴趣的所有用户ID:

$index = [];
$ids = array_reduce($array, function($ids, $object) use (&$index) {
    $ids[] = $object->userId;

    return $ids;
});

$ids_for_sql = '(' . implode(', ', $ids)

您还正在构建“索引”($index),以便能够直接访问数组中的对象,而不必再次对其进行迭代。

现在您可以进行第二个查询,以获取“ group”属性:

$groups_query = "SELECT userId, group from users WHERE userId IN $ids_for_sql";

现在,这只是从两个查询中“抽取”数据的问题:

foreach ($conn->query($groups_query) as $row) {
    $index[$row['userId']->group = $row['group'];
}

使用此方法,现在将正确更新包含“用户”对象的原始$array并且仅进行2个查询,而不是11个查询

。这样可以更好地执行和扩展,并且不会增加复杂性。

您可以看到一个简单而有效的演示(使用数组而不是SQL查询)here

您必须先存储每个项目,从数组项目中获取ID,然后使用SQL选择数据。

尝试:

foreach($array as $key=>$item) {
    $sql = "SELECT group from users WHERE userId = ".$item["userId"];
    $result = $conn->query($sql);
    if ($result->num_rows > 0) {
        $db_data = $result->fetch_assoc();
        //do stuff with db data

        $array[$key]["group"] = $group; //insert group to this variable
    }
}

-2
投票

您必须先存储每个项目,从数组项目中获取ID,然后使用SQL选择数据。

© www.soinside.com 2019 - 2024. All rights reserved.