我正在使用一个键值对数组(值可能是数组)来构造SQL查询的WHERE语句。
键值对被转换为"键"="值",并在它们之间放置 AND,但如果值是一个数组,则反过来又会内爆到 OR 条件中。
private function constructWhereStatement() {
if (!isset($this->where) || !is_array($this->where)) {
return 'WHERE 1';
}
array_walk($this->where, function(&$value, $key) {
if (is_array($value)) {
array_walk($value, function (&$v, $k, $key){
$v = "`$key` = '$v'";
}, $key);
$value = "(" . implode(' OR ', $value) . ")";
} else {
$value = "`$key` = '$value'";
}
});
return "WHERE " . implode(' AND ', $this->where);
}
因此,['side' => 'left', 'type' => ['page', 'dropdown']]
将返回:
WHERE `side` = 'left' AND (`type` = 'page OR `type` = 'dropdown')
有没有更好的方法可以做到这一点?也许是递归?
也许使用 IN ()
WHERE `side` = 'left' AND type IN('type','dropdown')