鉴于以下关系:
我在中心创建了一个查找程序,用城市代码返回中心名称(如果存在城市代码)。
我已使用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]);
}