我正在处理产品和类别之间多对多关系的联结表。使用这个特定的函数,我试图接受一个product_ID变量并获取一个数组中的所有相关类别名称。但是,在目前的设置中,当我知道有几个产品ID时,每个产品ID只能获得一个类别。任何想法?还有谁知道一个很好的简单解决方案,以更直观地跟踪mysql中的M2M关系?
//INPUT PRODUCT ID, GET ASSOCIATED CATEGORIES function productcat($pid) { global $sql; $query = "SELECT * FROM Product_Category WHERE Product_ID = '$pid'"; $result = mysqli_query($sql, $query); $catidarray = array(); while($row = mysqli_fetch_array($result)) { array_push($catidarray, $row['Category_ID']); } foreach($catidarray as $i) { $query = "SELECT * FROM Categories WHERE Category_ID = '$i'"; $result = mysqli_query($sql, $query); $namearray = array(); while($row = mysqli_fetch_array($result)) { array_push($namearray, $row['Name']); } } return $namearray; }
答案 0 :(得分:1)
您的功能有问题。
在你的第二个foreach中,你将变量 $ namearray 放在循环中,在每次运行时将其值重置为空数组 $ namearray = array(); 。把它放在foreach之外:
//--> put it here
$namearray = array();
foreach($catidarray as $i) {
$query = "SELECT * FROM Categories WHERE Category_ID = '$i'";
$result = mysqli_query($sql, $query);
while($row = mysqli_fetch_array($result)) {
array_push($namearray, $row['Name']);
}
}
而且,我只是想对你的功能提出一些建议。由于您拥有junction table
,因此您无需为product
和category
单独查询,以便从这些表中获取所需的值。
只需执行INNER JOIN即可最大限度地利用您的表格关系。
使用您的联结表Product_Category
,因为这是创建该联结表的真正目的。
SELECT *
FROM Product_Category AS a
INNER JOIN Category AS b
ON a.Category_ID = b.Category_ID
WHERE Product_ID = $pid
在你的功能中,你可以试试这个:没有经过测试,但希望这会给你一些想法。
//INPUT PRODUCT ID, GET ASSOCIATED CATEGORIES
function productcat($pid) {
global $sql;
$query = "SELECT *
FROM Product_Category as a
INNER JOIN Category as b
ON a.Category_ID = b.Category_ID
WHERE Product_ID = {$pid}";
$result = mysqli_query($sql, $query);
$namearray = array();
while($row = mysqli_fetch_array($result)) {
array_push($catidarray, $row['Name']);
}
return $namearray;
}
然后就是这样:))
顺便说一句,在最新版本的php中, mysql _ 函数已被弃用。如果您要使用PDO或MySQLi,情况会好得多。 请同时检查:PDO vs. MySQLi