3

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

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

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

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

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

4

4 回答 4

1

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

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

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

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

于 2013-10-10T10:32:56.867 回答
1

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

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

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

于 2013-10-10T10:13:39.170 回答
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 - 它将数组恢复到其预展平状态。

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

于 2013-10-10T11:18:27.553 回答
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');
于 2020-11-05T22:10:15.610 回答