CakePHP:如何控制find()方法返回的数据结构

时间:2013-04-18 15:04:09

标签: php arrays cakephp cakephp-2.0

在我的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()手动重新调整数据,但我宁愿理解为什么它们不同而且不必。)

2 个答案:

答案 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];