在使用addCase的CakePHP 3.X中,我应该如何将值定义为回退?

时间:2017-02-22 14:55:02

标签: cakephp orm cakephp-3.x

鉴于以下关系:

  • 中心所属城市

我在中心创建了一个查找程序,用城市代码返回中心名称(如果存在城市代码)。

我已使用if成功创建了我的查询,如下所示:

public function findWithCityCode(Query $query, array $options = [])
{
    $expression = $query->func()->if([
        $query->func()->length(['Cities.code' => 'identifier']),
        $query->func()->concat([
            '(',
            'Cities.code' => 'identifier',
            ')',
            ' ',
            'Centers.name' => 'identifier'
        ]),
        'Centers.name' => 'identifier'
    ]);
    return $query->contain(['Cities'])->select(['name' => $expression]);
}

但这对sqlite不起作用,因为sqlite没有IF函数。这就是我将我的查询转换为使用CASE而不是IF的原因,但问题出现了:

public function findWithCityCode(Query $query, array $options = [])
{
    $expression = $query->newExpr()->addCase([
        $query->func()->length(['Cities.code' => 'identifier']),
    ],[
        $query->func()->concat([
            '(',
            'Cities.code' => 'identifier',
            ')',
            ' ',
            'Centers.name' => 'identifier'
        ]),
        'Centers.name' // here's the problem
    ],['string']);
    return $query->contain(['Cities'])->select(['name' => $expression]);
}

这样做适用于IF,但Centers.name代替实际ELSE值显示Centers.name

[
    (int) 0 => object(App\Model\Entity\Center) {
        'name' => '(MAD) PALACIO SANTA ANA',
    [...]
  }
]

但是对于else,结果会显示Centers.name而不是真正的Centers.name值:

[
    (int) 15 => object(App\Model\Entity\Center) {
        'name' => 'Centers.name',
    [...]
]

我尝试使用Centers.name更改['Centers.name' => 'identifier']以及类似的结论,但这些都没有效果。

任何人都可以帮我吗?

编辑:在找到重复感谢@ndm后,我在这里添加了易于访问的解决方案(这样您就不需要遍历链接并阅读新问题)。解决方案是使用Cake\Database\Expression\IdentifierExpression

public function findWithCityCode(Query $query, array $options = [])
{
    $expression = $query->newExpr()->addCase([
        $query->func()->length(['Cities.code' => 'identifier']),
    ],[
        $query->func()->concat([
            '(',
            'Cities.code' => 'identifier',
            ')',
            ' ',
            'Centers.name' => 'identifier'
        ]),
        new Cake\Database\Expression\IdentifierExpression('Centers.name') // here's the solution
    ],['string']);
    return $query->contain(['Cities'])->select(['name' => $expression]);
}

0 个答案:

没有答案