Cakephp 3.0-案例语句的查询生成器
我按照CakePHP3的食谱创建了一个case语句 但是sql查询的结果不是预期的。语句的“Else”部分缺失 这是我的代码:Cakephp 3.0-案例语句的查询生成器,cakephp,orm,query-builder,cakephp-3.0,Cakephp,Orm,Query Builder,Cakephp 3.0,我按照CakePHP3的食谱创建了一个case语句 但是sql查询的结果不是预期的。语句的“Else”部分缺失 这是我的代码: $query = $this->Attendees->find()->contain(['Users']); $lastModifedCase = $query->newExpr()->addCase($query->newExpr()->add(['Attendees.modified <' => 'Users.
$query = $this->Attendees->find()->contain(['Users']);
$lastModifedCase = $query->newExpr()->addCase($query->newExpr()->add(['Attendees.modified <' => 'Users.modified']), [ 'Users.modified', 'Attendees.modified'], 'datetime');
$query->select(['Attendees.id', 'lastModified' => $lastModifedCase, 'Users.firstName', 'Users.lastName']);
die(var_dump($query->__debugInfo()));
当我深入研究cakephp代码时,我认为我的问题来自Cake\Database\Expression\CaseExpression的构造函数:
public function __construct($conditions = [], $values = [], $types = [])
{
if (!empty($conditions)) {
$this->add($conditions, $values, $types);
}
if (is_array($conditions) && is_array($values) && count($values) > count($conditions)) {
end($values);
$key = key($values);
$this->elseValue($values[$key], isset($types[$key]) ? $types[$key] : null);
}
}
$conditions未被视为数组,因此未设置else值
cakephp的版本是3.0.1
php的版本是5.4.34
你们觉得怎么样?我是做错了什么还是一个bug
提前感谢您的启示
当您使用数组语法生成条件时,需要记住数组的值PAR将永远被当作PARAM而不是原始字符串:['field_name >' => 'this is just a value, not a raw string']
原因是它可以防止SQL注入攻击。要解决您的问题,请执行以下操作:
['Attendees.modified < Users.modified']
['attendes.modified
与此相反:
['Attendees.modified <' => 'Users.modified']
['attendes.modified晚安之后我发现了我的错误,我将它与你分享……希望有一天它能帮助别人
语法不正确,因此$condition肯定不是数组
$lastModifedCase = $query->newExpr()->addCase(
$query->newExpr()->add([
'Attendees.modified <' => 'Users.modified'
]),
['Users.modified', 'Attendees.modified'],
'datetime'
);
$lastModifedCase=$query->newExpr()->addCase(
$query->newExpr()->添加([
'Attendes.modified感谢您的输入。我调整了代码。实际上,这删除了一个不必要的参数。不幸的是,这并不能解决我关于sql语句中缺少'ELSE'的问题。
['Attendees.modified <' => 'Users.modified']
$lastModifedCase = $query->newExpr()->addCase(
$query->newExpr()->add([
'Attendees.modified <' => 'Users.modified'
]),
['Users.modified', 'Attendees.modified'],
'datetime'
);
$lastModifedCase = $query->newExpr()->addCase(
[$query->newExpr()->add('Attendees.modified < Users.modified')],
[ 'Users.modified', 'Attendees.modified'],
['datetime','datetime']
);