我创建了一个函数,添加到查询中以选择对应的项目:
// BUILD FILTER
$filter = '';
$dups = array();
if ($filters) {
foreach ($filters as $t => $v) {
$key = substr_replace($t, '', 0, strpos($t, '|') + 1);
if (!in_array($key, $dups)) {
$dups[] = $key;
$filter .= "AND {$key} = '{$v}' ";
} else {
$filter .= "OR {$key} = '{$v}' ";
}
}
}
因此,假设此示例中的过滤器是“颜色”。每个$key
会说COLOUR
,每个$v
都会是它的值,蓝色和另一个粉红色。
然后将过滤器添加到现有查询中:
$sql = "SELECT * FROM product_filter f
LEFT JOIN product_allow a ON (a.prod_sku = f.prod_sku)
INNER JOIN product_image i ON (i.prod_sku = f.prod_sku)
INNER JOIN dh_product_basic b ON (b.prod_sku = f.prod_sku)
WHERE a.prod_status = 1
AND f.CATEGORY = '{$cate}'
AND i.prod_isMain = 1 {$filter}
GROUP BY b.prod_sku, b.prod_category
ORDER BY b.prod_price DESC";
工作正常,除了两个$key
相同,因此使用OR
操作数时,它需要在其周围括号(f.GRADE = 'B' OR f.GRADE = 'A')
。
这种类型的过滤对我来说有点新鲜,所以我不确定如何更改顶部代码,以便在需要括号时将其添加到正确的位置。
有关如何改进此功能的任何想法?
谢谢
答案 0 :(得分:0)
我不确定这是否是最好的apporach,但我设法这样做:
// BUILD FILTER
$filter = '';
$dups = array();
if ($filters) {
foreach ($filters as $t => $v) {
$key = substr_replace($t, '', 0, strpos($t, '|') + 1);
if (!in_array($key, $dups)) {
$dups[] = $key;
$filter .= "AND {$key} = '{$v}' "; // AND
} else {
$i = strripos($filter, "AND");
$filter = substr_replace($filter, " (", $i+3, 0);
$filter .= "OR {$key} = '{$v}') "; // OR
}
}
}
因此当它可以看到它会添加一个OR时,它会搜索最后一个AND,然后添加一个括号。似乎工作,但任何更好的建议是非常受欢迎的。
由于