因此,当我在相应的模型/控制器中时,afterFind可以正常工作并且很漂亮。但是,在调用关联模型时,发送到afterFind回调的数据格式不同。这会导致afterFind出来,因为它无法找到它在原始模型/控制器中工作时所做的相同的数组索引。CakePHP:afterFind与关联很奇怪
任何人都知道为什么,或者是什么修复?
因此,当我在相应的模型/控制器中时,afterFind可以正常工作并且很漂亮。但是,在调用关联模型时,发送到afterFind回调的数据格式不同。这会导致afterFind出来,因为它无法找到它在原始模型/控制器中工作时所做的相同的数组索引。CakePHP:afterFind与关联很奇怪
任何人都知道为什么,或者是什么修复?
这是afterFind
回调的第二个参数。
$primary
告诉你,如果找到的是该模型直接(真)调用,或者如果它是由相关的模型(假)进行调用。
从书的说明:
的$主参数指示当前模式是否是 该查询起源于或者判断这种模式 被质疑为关联模型。如果模型被查询为 关联,$结果的格式可能不同;
如果使用递归查找 ,则希望$ primary为true的代码可能会得到一个“不能使用 字符串偏移量作为数组”PHP的致命错误。
所以,你可能取决于$primary
值需要不同的处理逻辑
$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;
}
或者,您也许可以只检查模型本身的字段位置。如果该字段不存在于顶层,则需要迭代该组结果。
看来Cake 2.6包含a fix for this,确保所有$results
阵列的格式一致。我已经用RC版本做了一些测试,它似乎工作,数组全部以格式{n}.ModelName.data
传递。
此修复默认情况下处于启用状态,但如果需要,您也可以恢复到原有行为。只需添加以下到您的模型(或AppModel)定义:
public $useConsistentAfterFind = false;
我检查主,在2个不同的场景中我得到了初级错误,结果结构是不同的。我认为我能解决这个问题的唯一方式就像人们在这里建议检查结果的结构。 –