从CakePHP查询中获取一个扁平数组

4
我正在使用cakephp来运行一个查询,这个查询包括自定义派生字段以及一些在表中的字段。
Cake返回表中的字段并将其他字段放在0键的数组中 - 实质上会分裂我的结果,之后我需要将它们合并在一起。
我知道我可以使用虚拟字段将派生字段放入主数组中,但它们非常自定义且可能经常变动,因此不适合将这些字段作为虚拟字段。
我希望有某种选项,让cakephp将所有内容都返回到数组的0键中。类似于 $this->Model->find('all',$options,RTN_FLAT_ARRAY) 是否已经有类似这样的选项?

为什么需要在单个数组中? - Moyed Ansari
你想修改CakePHP核心还是打算编写插件?你会如何处理一对多的关系? - Álvaro González
你可以使用 after-find 来实现,或者暂时接受 CakePHP 返回的结果。除了一致性/方便之外,你还有其他原因想要这样做吗? - AD7six
4个回答

1

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

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

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

在这种方式下,虚拟字段会附加到模型上,仅在操作期间存在。

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 - 它将数组恢复到其未展开的状态。
当然,您可以编写循环以以任何格式呈现数组,但这不是非常“cakeish”。

1
这没有任何意义,因为它会破坏你的结果。你正在使用“all”查找。因此,预计它将在数组中返回0、1、2...条记录,而不仅仅是一条记录。如果你展平这个数组,你就只得到了一条记录,失去了所有其他记录。
请改用“first”,并将自定义字段放在返回的记录中。你可以使用模型的afterFind()回调来修改结果集。
另外,我不会展平数组,结构有其特定的原因。CakePHP中的一切都遵循惯例。例如,当你设置表单字段时,结果将与之匹配。如果你改变了这个结构,你将不得不在其他地方做更多的手动工作。遵循惯例,它们存在的理由。

我认为你误读了问题。他们要求合并模型名称键和0索引的“这些字段不在表中”的键,即$foo[0]['Post']['title'] => $foo[0][0]['title'],在各种情况下都是非常合理的,尽管通常要求反过来做(将浮动数据合并到主模型的键下)。 - AD7six

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接