我正在使用cakephp来运行一个查询,这个查询由自定义派生字段以及表中的一些字段组成。Cake在自己的数组中返回表中的值,在数组键为0的数组中返回其他值--实际上是将结果拆分,然后我必须将结果合并在一起。我知道我可以使用虚拟字段将派生字段放到主数组中,但是它们是非常自定义的,可以更改很多,因此不适合将这些字段作为虚拟字段。我想要的是一个选项,这样cakephp就可以把所有的东西都返回到数组的0键。这样的事情已经有可能了吗?
vnzz0bqm1#
这没有任何意义,因为它会破坏您的结果。您使用的是“all”查找。因此,它应该返回数组中的0、1、2...条记录,而不是一条记录。如果您将其扁平化,则只会得到一条记录,并丢失所有其他记录。使用“first”代替,并将您的自定义字段放在它将返回的记录中。您可以使用模型的afterFind()回调来修改结果集。我也不会把数组变平,因为结构是有原因的。CakePHP中的所有东西都遵循惯例。所以,例如,当你设置表单字段时,结果将与它们匹配。如果你改变了结构,你将不得不在其他地方做更多的手工工作。遵循惯例,它们是有原因的。
guicsvcw2#
您可以在执行find()之前在控制器中添加虚拟字段
$this->Model-virtualFields['field_sum'] = 'SUM(field)'; $this->Model->find('all', array('fields' => array('Model.field_sum')));
以这种方式,虚拟场仅在动作的持续时间内被附加到模型,
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状态。当然,您总是可以编写一个循环,以您喜欢的任何格式表示数组,但这不是很“容易”
r3i60tvu4#
对于cakephp 2,您可能需要查看Set::flathttps://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::classicExtracthttps://book.cakephp.org/2/en/core-utility-libraries/set.html#Set::classicExtract
$users = $this->User->find('all'); $results = Set::classicExtract($users, '{n}.User');
4条答案
按热度按时间vnzz0bqm1#
这没有任何意义,因为它会破坏您的结果。您使用的是“all”查找。因此,它应该返回数组中的0、1、2...条记录,而不是一条记录。如果您将其扁平化,则只会得到一条记录,并丢失所有其他记录。
使用“first”代替,并将您的自定义字段放在它将返回的记录中。您可以使用模型的afterFind()回调来修改结果集。
我也不会把数组变平,因为结构是有原因的。CakePHP中的所有东西都遵循惯例。所以,例如,当你设置表单字段时,结果将与它们匹配。如果你改变了结构,你将不得不在其他地方做更多的手工工作。遵循惯例,它们是有原因的。
guicsvcw2#
您可以在执行find()之前在控制器中添加虚拟字段
以这种方式,虚拟场仅在动作的持续时间内被附加到模型,
brjng4g33#
您可能需要查看Hash::flatten
我认为这本烹饪书很好地解释了它的功能:
http://book.cakephp.org/2.0/en/core-utility-libraries/hash.html
“姐妹”函数是Hash::expand -它将阵列恢复到其preflattend状态。
当然,您总是可以编写一个循环,以您喜欢的任何格式表示数组,但这不是很“容易”
r3i60tvu4#
对于cakephp 2,您可能需要查看Set::flat
https://book.cakephp.org/2/en/core-utility-libraries/set.html#Set::flatten
您还可以查看Set::classicExtract
https://book.cakephp.org/2/en/core-utility-libraries/set.html#Set::classicExtract