3

所以当我在相应的模型/控制器中时,afterFind 工作得很好。但是,在调用关联模型时,发送到 afterFind 回调的数据格式不同。这会导致 afterFind 出错,因为它无法找到与在原始模型/控制器中工作时相同的数组索引。

任何人都知道为什么,或者修复可能是什么?

4

3 回答 3

3

$primary可能不是很有帮助;我发现它总是false在使用 ContainableBehaviour 超出第一个深度时:

$this->Model->find('first', array(
  'contain' => array(
    'SecondaryModel' => array(
      'TertiaryModel',
    ),
  ),
));

如果您要根据相关模型设置值,则可以检查其是否存在以处理如下任一结构:

function afterFind($results, $primary) {
  if (isset($results['TertiaryModel'])) {
    $results['secondary_model_field'] = 'value';
  }
  else {
    foreach ($results as &$result) {
      if (is_array($result) && isset($result['TertiaryModel'])) {
        $result[$this->alias]['secondary_model_field'] = 'value';
      }
    } unset($result);
  }

  return $results;
}

或者,您可以只检查模型本身上字段的位置。如果顶层不存在该字段,则需要遍历结果集。

于 2012-08-08T00:08:05.110 回答
2

这就是afterFind回调的第二个参数的用途。

$primary告诉您 find 是直接从此模型调用的(true),还是由关联模型调用的(false)。

书中的注释:

$primary 参数指示当前模型是否是发起查询的模型,或者此模型是否作为关联进行查询。如果将模型作为关联进行查询,则 $results 的格式可能会有所不同;

如果使用递归查找,则期望 $primary 为 true 的代码可能会从 PHP 中得到“不能将字符串偏移量用作数组”的致命错误。

因此,您可能需要不同的处理逻辑,具体取决于$primary

于 2012-06-05T19:30:59.110 回答
1

Cake 2.6 似乎对此进行了修复,以确保所有$results数组的格式一致。我对 RC 版本进行了一些测试,它似乎确实有效,数组都以 format 传递{n}.ModelName.data

默认情况下启用该修复,但如果需要,您也可以恢复到旧行为。只需将以下内容添加到您的模型(或 AppModel)定义中:

public $useConsistentAfterFind = false;
于 2014-11-26T12:49:07.403 回答