从cakephp查询中获取平面数组

fslejnso  于 2022-11-12  发布在  PHP
关注(0)|答案(4)|浏览(127)

我正在使用cakephp来运行一个查询,这个查询由自定义派生字段以及表中的一些字段组成。
Cake在自己的数组中返回表中的值,在数组键为0的数组中返回其他值--实际上是将结果拆分,然后我必须将结果合并在一起。
我知道我可以使用虚拟字段将派生字段放到主数组中,但是它们是非常自定义的,可以更改很多,因此不适合将这些字段作为虚拟字段。
我想要的是一个选项,这样cakephp就可以把所有的东西都返回到数组的0键。
这样的事情已经有可能了吗?

vnzz0bqm

vnzz0bqm1#

这没有任何意义,因为它会破坏您的结果。您使用的是“all”查找。因此,它应该返回数组中的0、1、2...条记录,而不是一条记录。如果您将其扁平化,则只会得到一条记录,并丢失所有其他记录。
使用“first”代替,并将您的自定义字段放在它将返回的记录中。您可以使用模型的afterFind()回调来修改结果集。
我也不会把数组变平,因为结构是有原因的。CakePHP中的所有东西都遵循惯例。所以,例如,当你设置表单字段时,结果将与它们匹配。如果你改变了结构,你将不得不在其他地方做更多的手工工作。遵循惯例,它们是有原因的。

guicsvcw

guicsvcw2#

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

$this->Model-virtualFields['field_sum'] = 'SUM(field)';

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

以这种方式,虚拟场仅在动作的持续时间内被附加到模型,

brjng4g3

brjng4g33#

您可能需要查看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 -它将阵列恢复到其preflattend状态。
当然,您总是可以编写一个循环,以您喜欢的任何格式表示数组,但这不是很“容易”

r3i60tvu

r3i60tvu4#

对于cakephp 2,您可能需要查看Set::flat
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');

相关问题