Cakephp 3.0-案例语句的查询生成器

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.

我按照CakePHP3的食谱创建了一个case语句

但是sql查询的结果不是预期的。语句的“Else”部分缺失

这是我的代码:

$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']
);