【问题标题】:Get a flat array from a cakephp query从 cakephp 查询中获取平面数组
【发布时间】:2013-10-10 09:48:22
【问题描述】:

我正在使用 cakephp 运行查询,此查询由自定义派生字段以及表中的一些字段组成。

Cake 在自己的数组中返回表中的那些,而在数组键 0 中返回其他的 - 本质上是拆分我的结果,然后我必须合并在一起。

我知道我可以使用虚拟字段将派生字段放入主数组,但是它们非常自定义并且可以更改很多,因此不适合将这些字段作为虚拟字段。

我想要的是某种选项,以便 cakephp 将所有内容返回到数组的 0 键中。类似$this->Model->find('all',$options,RTN_FLAT_ARRAY)

这样的事情已经可能了吗?

【问题讨论】:

  • 为什么需要单个数组。
  • 您是要修改CakePHP核心还是要写一个插件?您将如何处理一对多关系?
  • 您可以使用 after-find 来做到这一点,或者只使用(目前)CakePHP 返回的内容。除了一致性/方便性之外,您是否还有其他原因希望这样做?

标签: php mysql arrays cakephp


【解决方案1】:

你可能想看看 Hash::flatten
我认为这本食谱很好地解释了这个功能:

http://book.cakephp.org/2.0/en/core-utility-libraries/hash.html

$arr = array(
    array(
        'Post' => array('id' => '1', 'title' => 'First Post'),
        'Author' => array('id' => '1', 'user' => 'Kyle'),
    ),
    array(
        'Post' => array('id' => '2', 'title' => 'Second Post'),
        'Author' => array('id' => '3', 'user' => 'Crystal'),
    ),
);

$res = Hash::flatten($arr);
/* $res now looks like:
   Array (
    [0.Post.id] => 1,
    [0.Post.title] => First Post
    [0.Author.id] => 1,     [0.Author.user] => Kyle
    [1.Post.id] => 2,     [1.Post.title] => Second Post
    [1.Author.id] => 3,    [1.Author.user] => Crystal

“姐妹”函数是 Hash::expand - 它将数组恢复到其预展平状态。

当然,您总是可以编写一个循环来以您喜欢的任何格式显示数组,但这不是很“蛋糕”

【讨论】:

    【解决方案2】:

    您可以在执行 find() 之前在控制器中添加虚拟字段

    $this->Model-virtualFields['field_sum'] = 'SUM(field)';
    
    $this->Model->find('all', array('fields' => array('Model.field_sum')));
    

    通过这种方式,虚拟字段仅在操作期间附加到模型

    【讨论】:

      【解决方案3】:

      这没有任何意义,因为它会破坏您的结果。您正在使用“全部”查找。所以预计它将返回数组中的 0, 1, 2... 记录,而不仅仅是一条记录。如果你把它弄平,你只会得到一个记录而失去所有其他记录。

      改用“first”并将您的自定义字段放在它将返回的记录中。您可以使用模型的 afterFind() 回调来修改结果集。

      我也不会展平数组,结构存在是出于某种原因。 CakePHP 中的一切都遵循约定。因此,例如,当您设置它们时,结果将与您的表单字段匹配。如果你改变这个结构,你将不得不在其他地方做更多的手工工作。遵守约定,它们的存在是有原因的。

      【讨论】:

      • 我认为您误读了这个问题。他们要求合并模型名称键和索引为 0 的“这些字段不在表中”键,即$foo[0]['Post']['title'] => $foo[0][0]['title'],这在各种情况下都非常有意义,尽管通常要求这样做反之亦然(将浮动数据合并到主模型的键下)。
      【解决方案4】:

      对于 cakephp 2 你可能想看看 Set::flatten

      https://book.cakephp.org/2/en/core-utility-libraries/set.html#Set::flatten

      $arr = array(
          array(
              'Post' => array('id' => '1', 'title' => 'First Post'),
              'Author' => array('id' => '1', 'user' => 'Kyle'),
          ),
          array(
              'Post' => array('id' => '2', 'title' => 'Second Post'),
              'Author' => array('id' => '3', 'user' => 'Crystal'),
          ),
      );
      $res = Set::flatten($arr);
      /* $res now looks like:
          Array (
              [0.Post.id] => 1
              [0.Post.title] => First Post
              [0.Author.id] => 1
              [0.Author.user] => Kyle
              [1.Post.id] => 2
              [1.Post.title] => Second Post
              [1.Author.id] => 3
              [1.Author.user] => Crystal
          )
      */
      

      你也可以看看 Set::classicExtract

      https://book.cakephp.org/2/en/core-utility-libraries/set.html#Set::classicExtract

      $users = $this->User->find('all');
      $results = Set::classicExtract($users, '{n}.User');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-31
        • 1970-01-01
        • 2015-08-04
        • 2018-07-14
        • 2021-08-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多