在我的TestsController.php
我正在使用find()
方法......
$r = $this->Question->find('all', array('conditions' => $conditions ));
...结果数据如下所示:
array(
(int) 0 => array(
'Question' => array(
'id' => '2',
'created' => '2013-02-13 14:15:16',
'modified' => '2013-04-18 09:10:03'
),
), ...
注意数组中的每个项目是如何包装在另一个数组中的。我想使该数组的结构与我在其他地方使用它的方式一致,这样它就可以很好地处理元素和其他代码,这些代码在控制器中设置变量时期望结构匹配...
$question = $this->Question->findById($id);
$this->set('question', $question);
......结果如下:
array(
'Question' => array(
'id' => '1',
'created' => '2013-04-04 15:25:54',
'modified' => '2013-04-04 15:25:54'
), ...
我所知道的唯一区别是第二个示例使用findById()
方法,并且第一个示例中的find()
可能与另一个模型的控制器内部相关。
有没有办法让它们匹配?
(我知道我可以用array_map()
手动重新调整数据,但我宁愿理解为什么它们不同而且不必。)
答案 0 :(得分:3)
正如@dave所说,在期望多个记录时有编号数组是很自然的,就像find('list'),find('all')......好吧,除了find('first')之外的所有人。 /> 这只是了解您期望得到什么类型的记录的问题。
但是,如果您决定更改该功能并将每个记录作为编号数组以使其保持一致,则可以通过一种方式更改一个文件。
在您的AppModel
中public function afterFind($results, $primary = false) {
if(!Set::numeric(array_keys($results)) {
$results= array($results);
}
return $results;
}
这样,所有find()方法都将返回
array(
(int) 0 => array(
'Question' => array( /*data*/ ),
), ...
即使它只是一条记录。
警告:我在AppModel中没有尝试过,只是在特定情况下,所以测试功能并不断调整代码直到涵盖每个案例。可能产生错误的一些事情:$results
没有结果,以及从其他模型检索关联数据时。所以请注意,因为该功能不是确定的,你必须稍微玩一下(可能)
答案 1 :(得分:1)
当你使用find时,它需要多个结果,当你使用findById时,它需要一个。当然,第一种方法返回一个数组数组,因此您可以迭代每个项目。如果你只希望得到一件商品,那么你应该能够做到:
$r = $this->Question->find('all', array('conditions' => $conditions ));
$r = $r[0];
如果您使用的是较新版本的PHP,您甚至可以这样做:
$r = $this->Question->find('all', array('conditions' => $conditions ))[0];