gpt4 book ai didi

php - CakePHP 3 - 如何在查询生成器中编写 COALESCE(...)?

转载 作者:行者123 更新时间:2023-12-04 00:02:31 25 4
gpt4 key购买 nike

如何在查询生成器中编写这种 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'

所以我的新问题是如何让查询构建器将字符串评估为表/字段名称?

最佳答案

我无法让 Cake 的 coalesce() 函数将参数作为字段求值,它只是返回字段名称的实际字符串。

我通过手动创建 COALESCE 语句让它工作。

// Create the query object first, so it can be used to create a SQL expression
$query = $this->Nodes->find();

// Modify the query
$query
->select([
'id',
'value' => $query->newExpr('COALESCE(Nodes.value, Parents.value)')
])
->where(['Nodes.id' => $id])
->contain('Parents')
->first();

关于php - CakePHP 3 - 如何在查询生成器中编写 COALESCE(...)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40534557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com