我使用cakephp来运行查询,此查询包含自定义派生字段以及表中的一些字段。
Cake在表中返回表中的那些数组,其他数据键为0 - 基本上将我的结果拆分,然后我必须合并在一起。
我知道我可以使用虚拟字段将派生字段放入主数组中,但它们非常自定义且可能会发生很大变化,因此不适合将这些字段作为虚拟字段。
我想要的是某种类型的选项,以便cakephp只返回数组的0键中的所有内容。像$this->Model->find('all',$options,RTN_FLAT_ARRAY)
这样的事情已经可以吗?
答案 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');