因此,当我在相应的模型/控制器中时,AfterFind工作正常并且花花公子。但是,在调用关联模型时,发送到afterFind回调的数据的格式不同。这会导致afterFind被废弃,因为它无法找到它在原始模型/控制器中工作时所执行的相同数组索引。
任何人都知道原因,或者修复可能是什么?
答案 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;