3 回答

TA貢獻2012條經(jīng)驗 獲得超12個贊
對每條記錄進行一次額外查詢是一個非常糟糕的主意,并且是N+1 問題的一個明顯示例:您需要獲取實體的“N”個子實體,并且最初只獲取父實體。
如果您的初始查詢有 100 個用戶,那么您將完成 101 個查詢。如果您以后需要一些其他不相關(guān)的領(lǐng)域,這將開始迅速失控。
這對性能非常不利,并且隨著您的應用程序變得越來越復雜,它很容易對其產(chǎn)生非常嚴重的影響。
假設(shè)您無法修改初始查詢并進行簡單JOIN查詢以獲取所需數(shù)據(jù),最好簡單地進行兩次查詢并拼接結(jié)果數(shù)據(jù)。即使您可以修改原始查詢,這最終可能會表現(xiàn)得更好。
如何去做:
假設(shè)您的初始對象數(shù)組具有 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) . ')';
您還正在構(gòu)建一個“索引”( $index),以便能夠直接訪問數(shù)組中的對象,而無需再次對其進行迭代。
現(xiàn)在您可以進行第二個查詢來獲取您的“組”屬性:
$groups_query = "SELECT userId, group from users WHERE userId IN $ids_for_sql";
現(xiàn)在只需“拼接”來自兩個查詢的數(shù)據(jù)即可:
foreach ($conn->query($groups_query) as $row) {
$index[$row['userId']]->group = $row['group'];
}
有了這個,現(xiàn)在您的原始$array包含“用戶”對象將被正確更新,并且只進行 2 次查詢而不是 11 次。這可以更好地執(zhí)行和擴展,并且不會增加顯著的復雜性。
您可以在這里看到一個簡單的、有效的演示(使用數(shù)組而不是 SQL 查詢)。

TA貢獻1865條經(jīng)驗 獲得超7個贊
首先,我們將從對象數(shù)組中獲取 userID 的值,然后在數(shù)據(jù)庫中查詢它,假設(shè)數(shù)組為 $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條經(jīng)驗 獲得超6個贊
您必須查找項目,從數(shù)組項目中獲取 ID,然后使用 SQL 選擇數(shù)據(jù)。
嘗試:
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 關(guān)注
- 190 瀏覽
添加回答
舉報