public static function condition($context, $prefix, $expr, $args)
{
if (!empty($expr)) {
if ($args) {
//因为PDO不支持绑定数组变量, 这里需要手动展开数组
//也就是说把 where("id IN(?)", [1,2]) 展开成 where("id IN(?,?)", 1,2)
$cutted = null;
$cut = null;
$toReplace = array();
$newArgs = array();
//找到所有数组对应的?符位置
foreach ($args as $k => $arg) {
if (is_array($arg) || is_a($arg, 'phprs\\ezsql\\Native')) {
if (!$cutted) {
$cut = new NestedStringCut($expr);
$cutted = $cut->getText();
}
//找到第$k个?符
$pos = self::findQ($cutted, 0, $k);
$pos = $cut->mapPos($pos);
Verify::isTrue($pos !== false, new \InvalidArgumentException("unmatched params and ? @ {$expr}"));
if (is_array($arg)) {
$stubs = [];
foreach ($arg as $i) {
if (is_a($i, 'phprs\\ezsql\\Native')) {
$stubs[] = strval($i);
} else {
$stubs[] = '?';
$newArgs[] = $i;
}
}
$stubs = implode(',', $stubs);
} else {
$stubs = strval($arg);
}
$toReplace[] = [$pos, $stubs];
} else {
$newArgs[] = $arg;
}
}
if (count($toReplace)) {
$toReplace = array_reverse($toReplace);
foreach ($toReplace as $i) {
list($pos, $v) = $i;
$expr = substr($expr, 0, $pos) . $v . substr($expr, $pos + 1);
}
$args = $newArgs;
}
}
$context->appendSql($prefix . ' ' . $expr);
if ($args) {
$context->appendParams($args);
}
}
}