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

标签 php mysql arrays select-n-plus-1

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

// 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';
});

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

我怎样才能做到这一点?

最佳答案

为每条记录做一个额外的查询是一个非常糟糕的主意,也是 N+1 问题的一个明显例子:你需要得到一个实体的“N”个 child ,并且最初只获取了父实体

如果您的初始查询有 100 个用户,您将结束进行 101 个查询。如果您以后需要一些其他不相关的领域,这将很快变得一发不可收拾。

对性能非常不利,随着您的应用程序变得越来越复杂,它很容易对其产生非常严重的影响。

假设您无法修改初始查询并进行简单的 JOIN 查询来获取所需数据,最好只进行两个查询并拼接结果数据。即使您可以修改原始查询,这最终可能会表现得更好。

如何着手:

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

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

    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) {
    $index[$row['userId']]->group = $row['group'];
}

现在,包含“用户”对象的原始 $array 将得到正确更新,并且只进行 2 次查询而不是 11 次。这会更好地执行和扩展,并且不会显着增加复杂性。

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

关于php - 如何将数据库中的信息添加到现有的对象数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60598761/

相关文章:

php - 如何在外部调用PHP函数

php - 如何在php中为json api实现缓存系统

mysql - 如何删除MySQL中原始内容的引号?

php - Codeigniter MYSQL QUERY insert_string 避免重复

php - 如何使用unserialize将序列化数据检索到php中的表中

javascript - 代码不显示 json 页面中的数据

php - 如何在 X 分钟后更新我的表格?

php - 如何使用 PHP 将透明 PNG 与图像合并?

php - 添加附加值时出现 mysql 语法冲突

c# - 如何检查 int[] 是否只包含某些数字?