如何在查询生成器中编写这种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();
CakePHP:为插件创建动作挂钩 - php我想包括与Wordpress中类似的动作挂钩。我已经阅读了有关编写插件的章节,但是我希望能够在不更改父应用程序代码的情况下对其进行维护。是否对此有任何支持?如果没有,有没有好的方法?我有一些想法,但我担心自己会重新发明轮子。 参考方案 就在这里。CakePHP Event System它的工作原理与WordPress的挂钩非常相似,但效果更好。您可以在不同的…
CakePHP分页和排序 - php好像我已经尝试了一切,所以现在我来找你。我正在尝试订购数据,但进展不顺利,对Cake来说有点新。这是我的代码:$this->set('threads', $this->paginate('Thread', array( 'Thread.hidden' => 0, 'Thr…
如何访问对象数据PHP CakePHP 3.1 - php这是一个cakephp 3.1查询结果,我希望直接访问$ data-> items,但是我收到一条错误消息,指出未找到关键项目,并且我不希望使用funtcion toArray(),因为如果我这样做了只会返回'items'=> ...,而我丢失了所有'query'=> ...信息。您能以正确的语法帮助我获得$ data-> items…
PHP-全局变量的性能和内存问题 - php假设情况:我在php中运行一个复杂的站点,并且我使用了很多全局变量。我可以将变量存储在现有的全局范围内,例如$_REQUEST['userInfo'],$_REQUEST['foo']和$_REQUEST['bar']等,然后将许多不同的内容放入请求范围内(这将是适当的用法,因为这些数据指的是要求自…
PHP strtotime困境 - php有人可以解释为什么这在我的服务器上输出为true吗?date_default_timezone_set('Europe/Bucharest'); var_dump( strtotime('29.03.2015 03:00', time()) === strtotime('29.03.2015 04:00…