-1

在我的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()但我宁愿理解为什么它们不同而不必这样做。)

4

2 回答 2

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没有结果,以及从其他模型检索相关数据时。所以要小心,因为这个功能不是确定的,你必须玩一点(可能)

于 2013-04-18T15:43:42.923 回答
1

当您使用 find 时,它需要多个结果,当您使用 findById 时,它需要一个。自然地,第一个方法返回一个数组数组,因此您可以迭代每个项目。如果您只希望拿回一件物品,那么您应该可以这样做:

$r = $this->Question->find('all', array('conditions' => $conditions ));
$r = $r[0];

如果您使用的是较新版本的 PHP,您甚至可以执行以下操作:

$r = $this->Question->find('all', array('conditions' => $conditions ))[0];
于 2013-04-18T15:29:48.030 回答