所以当我在相应的模型/控制器中时,afterFind 工作得很好。但是,在调用关联模型时,发送到 afterFind 回调的数据格式不同。这会导致 afterFind 出错,因为它无法找到与在原始模型/控制器中工作时相同的数组索引。
任何人都知道为什么,或者修复可能是什么?
所以当我在相应的模型/控制器中时,afterFind 工作得很好。但是,在调用关联模型时,发送到 afterFind 回调的数据格式不同。这会导致 afterFind 出错,因为它无法找到与在原始模型/控制器中工作时相同的数组索引。
任何人都知道为什么,或者修复可能是什么?
$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;
}
或者,您可以只检查模型本身上字段的位置。如果顶层不存在该字段,则需要遍历结果集。
这就是afterFind
回调的第二个参数的用途。
$primary
告诉您 find 是直接从此模型调用的(true),还是由关联模型调用的(false)。
书中的注释:
$primary 参数指示当前模型是否是发起查询的模型,或者此模型是否作为关联进行查询。如果将模型作为关联进行查询,则 $results 的格式可能会有所不同;
如果使用递归查找,则期望 $primary 为 true 的代码可能会从 PHP 中得到“不能将字符串偏移量用作数组”的致命错误。
因此,您可能需要不同的处理逻辑,具体取决于$primary
Cake 2.6 似乎对此进行了修复,以确保所有$results
数组的格式一致。我对 RC 版本进行了一些测试,它似乎确实有效,数组都以 format 传递{n}.ModelName.data
。
默认情况下启用该修复,但如果需要,您也可以恢复到旧行为。只需将以下内容添加到您的模型(或 AppModel)定义中:
public $useConsistentAfterFind = false;