首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在CakePHP查找查询中正确嵌套自定义字段?

如何在CakePHP查找查询中正确嵌套自定义字段?
EN

Stack Overflow用户
提问于 2014-01-28 15:46:13
回答 1查看 726关注 0票数 5

我们通常处理的代码如下所示:

代码语言:javascript
复制
return $this->find(
'all', [
  'fields' => ['DISTINCT Tag.tag', 'COUNT(Tag.tag) as count'],
  'group' => ['Tag.tag'],
  'order' => ['count' => 'DESC']
]);

这个查询将我们引向以下输出:

代码语言:javascript
复制
[0] => Array
    (
        [Tag] => Array
            (
                [tag] => walls.io
            )

        [0] => Array
            (
                [count] => 15
            )

    )

如您所见,查询以“某种程度上错误”的嵌套方式返回结果。不幸的是,"count“字段被放入一个伪-array中。

CakePHP在内部使用像Tag__field这样的语法来正确嵌套虚拟字段。

当将代码更改为Model_-语法时,问题仍然是一样的:

代码语言:javascript
复制
return $this->find(
'all', [
  'fields' => ['DISTINCT Tag.tag', 'COUNT(Tag.tag) as Tag__count'],
  'group' => ['Tag.tag'],
  'order' => ['COUNT(Tag.tag)' => 'DESC']
]);

输出:

代码语言:javascript
复制
[0] => Array
    (
        [Tag] => Array
            (
                [tag] => walls.io
            )

        [0] => Array
            (
                [Tag__count] => 15
            )

    )

解决方案1: array_map

CakePHP的优点:有比在select语句之后手动映射数组更好/更优雅的解决方案吗?

代码语言:javascript
复制
$tags = array_map(function($tag) {
  $tag['Tag']['count'] = $tag[0]['count'];
  unset($tag[0]);

  return $tag;
}, $tags);

解决方案2:虚拟字段

如上所述,使用虚拟字段可以解决这个问题:

代码语言:javascript
复制
$this->virtualFields = ['count' => 'COUNT(Tag.Tag)'];
return $this->find(
'all', [
  'group' => ['Tag.tag'],
  'order' => [$this->getVirtualField('count') => 'DESC']
]);

不幸的是,使用此解决方案,根本不可能指定任何字段。只有完全离开“字段”-key,数组的嵌套才能像预期的那样工作。当选择$fields = 'Tag.tag‘时,$this->getVirtualField('count')嵌套再次出错。

CakePHP优点:您知道一种方法吗?即使您指定了自己的字段,嵌套也是正确的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-28 17:56:40

查看CakePHP代码,这样的方法并不存在。

查看lib/Cake/Model/Datasource/Database/Mysql.php文件。

查找名为:Mysql::resultSet( $results );(围绕第240项)的方法。

该方法将结果映射到数组。若要确定某列是否为表的一部分,它将使用PDOStatement::getColumnMeta()。对于“虚拟列”,该方法将返回一个空表,因此CakePHP代码将将其单独放置,请参见else分支

$this->map[$index++] = array(0, $column['name'], $type);

为了避免其他分支,您必须使用Virtual,但随后您会遇到您注意到的其他问题。

因此,您可以使用array_map解决方案,或者尝试重载该Mysql类,并添加自定义逻辑以确定列的合适位置。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21410237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档