如何在查询生成器中编写这种COALESCE()
语句?CakePHP 3 - 如何在查询生成器中编写COALESCE(...)?
SQL
SELECT COALESCE(n.value, p.value) AS value
FROM nodes n
LEFT JOIN parents p ON p.id = n.parent_id
PHP
我可以检索两个孩子和家长的值,然后再通过结果集,只是使用父之一,如果孩子有一个为空,但如果有一种更优雅的方式将其构建到查询中,我宁愿这样做。
$child = $this->Nodes->find()
->select(['id', 'value'])
->where(['Nodes.id' => $id])
->contain([
'Parents' => function ($q) {
return $q->select('value');
}
])
->first();
if (empty($child->value)) {
$child->value = $child->parent->value;
}
更新1
所以这是我的时刻,但它不工作。
$child = $this->Nodes->find()
->select(['id', 'value'])
->where(['Nodes.id' => $id])
->contain([
'Parents' => function ($q) {
return $q->select([
'value' => $q->func()->coalesce([
'Nodes.value',
'Parents.value'
])
]);
}
])
->first();
返回:
object(Cake\ORM\Entity) {
'id' => (int) 234,
'value' => (float) 0,
'[new]' => false,
'[accessible]' => [
'*' => true
],
'[dirty]' => [],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[invalid]' => [],
'[repository]' => 'Nodes'
}
孩子值为NULL
和父值是1.00
,所以我期望的实体值是'value' => (float) 1.00
但我相信它的到来了查询作为FALSE
转化为(float) 0
。
更新2
似乎走样聚结已经存在作为一个正常的场不起作用的名称。它需要一个唯一的字段名称作为合并结果。
更新3
我做了另一个试验,从两个表,而不是选择name
领域,它只是返回我进入功能(他们没有得到评估为列名),实际的字符串:
return $q->select([
'value' => $q->func()->coalesce([
'Nodes.name',
'Parents.name'
])
]);
返回的实体有:
'value' => 'Nodes.name'
所以我的新questio ñ将是如何让查询生成器评估字符串作为表/字段名称?
注意'COALESCE(n.value,p.value)AS value'是写这篇的首选方式 – rjdown
COALESCE也由ORM支持(不,它可以帮助你的问题了!):HTTP ://api.cakephp.org/3.3/class-Cake.Database.FunctionsBuilder.html#_coalesce – burzum
@rjdown谢谢,我已经更新了这个问题。 – BadHorsie