我在Atk4模型中有以下代码:
$sql = 'REPLACE(\'[dnum]\', \'{DD}\', LPAD(DAY([issue_date]), 2, \'0\'))';
$f = $this->addExpression('calc_document_number',
[$sql, 'type' => 'string', 'read_only' => true]);
上述代码应使用填充{DD}
列替换dnum
列中的issue_date
。直接用于数据库中的搜索/排序原因。
似乎SQL的{DD}
部分当前由Atk4解析/处理。是否有可能逃避花括号,以便Atk4会忽略它们?
注意:\{DD\}
不起作用
答案 0 :(得分:2)
是的,你是对的。转义大括号未在DSQL中实现,而不在Data中实现。
您可以直接使用expr()
方法并将{DD}
作为参数传递(不会再次替换)来解决此问题。
这种方式对我有用:
$expr = $model->expr('REPLACE([dnum], [], LPAD(DAY([issue_date]), 2, \'0\'))',[
'{DD}',
]);
$f = $model->addExpression('calc_document_number',
[$expr, 'type' => 'string', 'read_only' => true]);
// here is no need to set type=string and read_only=true because expression field will automatically be readonly and with string type
echo $m->action('select')->getDebugQuery();
还创建了一张未来参考凭证:https://github.com/atk4/dsql/issues/144