如何将数据库中的信息添加到现有的对象数组中?

我有一个以下格式的数组;


// 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 group from users WHERE userId = [userId in array]

然后我想将此值添加到数组中,最终数组应如下所示;


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';

});

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


我怎样才能做到这一点?


紫衣仙女
浏览 161回答 3
3回答

繁花如伊

对每条记录进行一次额外查询是一个非常糟糕的主意,并且是N+1 问题的一个明显示例:您需要获取实体的“N”个子实体,并且最初只获取父实体。如果您的初始查询有 100 个用户,那么您将完成 101 个查询。如果您以后需要一些其他不相关的领域,这将开始迅速失控。这对性能非常不利,并且随着您的应用程序变得越来越复杂,它很容易对其产生非常严重的影响。假设您无法修改初始查询并进行简单JOIN查询以获取所需数据,最好简单地进行两次查询并拼接结果数据。即使您可以修改原始查询,这最终可能会表现得更好。如何去做:假设您的初始对象数组具有 aformId和userId公共属性,首先获取您感兴趣的所有用户 ID:$index = [];$ids = array_reduce($array, function($ids, $object) use (&$index) {&nbsp; &nbsp; $ids[]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; = $object->userId;&nbsp; &nbsp; $index[$object->userId] = $object;&nbsp; &nbsp; return $ids;});$ids_for_sql = '(' . implode(', ', $ids) . ')';您还正在构建一个“索引”( $index),以便能够直接访问数组中的对象,而无需再次对其进行迭代。现在您可以进行第二个查询来获取您的“组”属性:$groups_query = "SELECT userId, group from users WHERE userId IN $ids_for_sql";现在只需“拼接”来自两个查询的数据即可:foreach ($conn->query($groups_query) as $row) {&nbsp; &nbsp; $index[$row['userId']]->group = $row['group'];}有了这个,现在您的原始$array包含“用户”对象将被正确更新,并且只进行 2 次查询而不是 11 次。这可以更好地执行和扩展,并且不会增加显着的复杂性。您可以在这里看到一个简单的、有效的演示(使用数组而不是 SQL 查询)。

莫回无

首先,我们将从对象数组中获取 userID 的值,然后在数据库中查询它,假设数组为 $arr。foreach($arr AS $key=>$item)&nbsp;{&nbsp; &nbsp; $userid=$item["userId"];&nbsp; // getting userId from object&nbsp; &nbsp; $query= $con->query("SELECT group from users WHERE userId='$userid'");&nbsp; &nbsp; if($query->num_rows>0)&nbsp; //checking if query has some result&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; $row=$result->fetch_assoc();&nbsp; &nbsp; &nbsp; //fetching the result&nbsp; &nbsp; &nbsp; &nbsp; $arr[$key]->group=$row['group'];&nbsp; // lastly attaching group key to the arr.&nbsp; &nbsp; }}

跃然一笑

您必须查找项目,从数组项目中获取 ID,然后使用 SQL 选择数据。尝试:foreach($array as $key=>$item) {&nbsp; &nbsp; $sql = "SELECT group from users WHERE userId = ".$item["userId"];&nbsp; &nbsp; $result = $conn->query($sql);&nbsp; &nbsp; if ($result->num_rows > 0) {&nbsp; &nbsp; &nbsp; &nbsp; $db_data = $result->fetch_assoc();&nbsp; &nbsp; &nbsp; &nbsp; //do stuff with db data&nbsp; &nbsp; &nbsp; &nbsp; $array[$key]["group"] = $group; //insert group to this variable&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP