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

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