3 回答
TA贡献2012条经验 获得超12个赞
对每条记录进行一次额外查询是一个非常糟糕的主意,并且是N+1 问题的一个明显示例:您需要获取实体的“N”个子实体,并且最初只获取父实体。
如果您的初始查询有 100 个用户,那么您将完成 101 个查询。如果您以后需要一些其他不相关的领域,这将开始迅速失控。
这对性能非常不利,并且随着您的应用程序变得越来越复杂,它很容易对其产生非常严重的影响。
假设您无法修改初始查询并进行简单JOIN查询以获取所需数据,最好简单地进行两次查询并拼接结果数据。即使您可以修改原始查询,这最终可能会表现得更好。
如何去做:
假设您的初始对象数组具有 aformId和userId公共属性,首先获取您感兴趣的所有用户 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 查询)。
TA贡献1865条经验 获得超7个赞
首先,我们将从对象数组中获取 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.
}
}
TA贡献1826条经验 获得超6个赞
您必须查找项目,从数组项目中获取 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
}
}
- 3 回答
- 0 关注
- 151 浏览
添加回答
举报