CakePHP:afterFind与关联很奇怪

时间:2012-06-05 19:14:27

标签: cakephp associations

因此,当我在相应的模型/控制器中时,AfterFind工作正常并且花花公子。但是,在调用关联模型时,发送到afterFind回调的数据的格式不同。这会导致afterFind被废弃,因为它无法找到它在原始模型/控制器中工作时所执行的相同数组索引。

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

3 个答案:

答案 0 :(得分:3)

$primary可能不是很有帮助;我发现使用超越第一深度的ContainableBehaviour时总是false

$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;
}

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

答案 1 :(得分:2)

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

$primary告诉您是否直接从此模型调用了查找( true ),或者是否由相关模型调用( false

书中的注释:

  

$ primary参数指示当前模型是否为   查询所源自的模型或此模型是否存在   被问到是一个协会。如果模型被查询为   关联$结果的格式可能不同;

     

期望$ primary为true的代码可能会得到“无法使用   字符串偏移量作为数组“如果递归查找则来自PHP的致命错误   使用。

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

的值

答案 2 :(得分:1)

Cake 2.6似乎包含a fix for this,确保所有$results数组的格式一致。我已经对RC版本做了一些测试,看起来确实有效,数组都以{n}.ModelName.data格式传递。

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

public $useConsistentAfterFind = false;