我创建了一个函数,其中添加到查询中以选择对应的项目:
// 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')
。
这种类型的过滤对我来说有点陌生,所以我不确定如何更改顶部代码,以便在需要括号的情况下将其添加到正确的位置。
关于如何改进这个功能,有什么想法吗?
感谢
我不确定这是否是最好的方法,但我已经设法做到了:
// 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,然后添加一个括号。似乎有效,但任何更好的建议都非常受欢迎。
感谢