区块链技术博客
www.b2bchain.cn

CakePHP 3-如何在查询生成器中编写COALESCE(…)? – php程序员分享

本文介绍了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(CakeORMEntity) {      '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(); 

我想包括与Wordpress中类似的动作挂钩。我已经阅读了有关编写插件的章节,但是我希望能够在不更改父应用程序代码的情况下对其进行维护。是否对此有任何支持?如果没有,有没有好的方法?我有一些想法,但我担心自己会重新发明轮子。 参考方案 就在这里。CakePHP Event System它的工作原理与WordPress的挂钩非常相似,但效果更好。您可以在不同的…

好像我已经尝试了一切,所以现在我来找你。我正在尝试订购数据,但进展不顺利,对Cake来说有点新。这是我的代码:$this->set('threads', $this->paginate('Thread', array( 'Thread.hidden' => 0, 'Thr…

这是一个cakephp 3.1查询结果,我希望直接访问$ data-> items,但是我收到一条错误消息,指出未找到关键项目,并且我不希望使用funtcion toArray(),因为如果我这样做了只会返回’items’=> …,而我丢失了所有’query’=> …信息。您能以正确的语法帮助我获得$ data-> items…

假设情况:我在php中运行一个复杂的站点,并且我使用了很多全局变量。我可以将变量存储在现有的全局范围内,例如$_REQUEST['userInfo'],$_REQUEST['foo']和$_REQUEST['bar']等,然后将许多不同的内容放入请求范围内(这将是适当的用法,因为这些数据指的是要求自…

有人可以解释为什么这在我的服务器上输出为true吗?date_default_timezone_set('Europe/Bucharest'); var_dump( strtotime('29.03.2015 03:00', time()) === strtotime('29.03.2015 04:00&#0…

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » CakePHP 3-如何在查询生成器中编写COALESCE(…)? – php程序员分享
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们