从cakephp查询中获取一个平面数组

时间:2013-10-10 09:48:23

标签: php mysql arrays cakephp

我使用cakephp来运行查询,此查询包含自定义派生字段以及表中的一些字段。

Cake在表中返回表中的那些数组,其他数据键为0 - 基本上将我的结果拆分,然后我必须合并在一起。

我知道我可以使用虚拟字段将派生字段放入主数组中,但它们非常自定义且可能会发生很大变化,因此不适合将这些字段作为虚拟字段。

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

这样的东西

这样的事情已经可以吗?

4 个答案:

答案 0 :(得分:1)

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

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

另外我不会压扁阵列,结构是出于某种原因。 CakePHP中的所有内容都遵循惯例。因此,例如,当您设置结果时,结果将与您的表单字段匹配。如果你改变了这种结构,你将不得不在其他地方做更多的手工工作。遵循惯例,他们出于某种原因。

答案 1 :(得分:1)

您可以在执行find()

之前在控制器中添加虚拟字段
$this->Model-virtualFields['field_sum'] = 'SUM(field)';

$this->Model->find('all', array('fields' => array('Model.field_sum')));

通过这种方式,虚拟字段仅在动作持续时间内附加到模型

答案 2 :(得分: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

“sister”函数是Hash :: expand - 它将数组恢复到preflattend状态。

当然你总是可以写一个循环来呈现你喜欢的任何格式的数组,但那不是很“蛋糕”

答案 3 :(得分:0)

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');