因此,當我在相應的模型/控制器中時,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個不同的場景中我得到了初級錯誤,結果結構是不同的。我認爲我能解決這個問題的唯一方式就像人們在這裏建議檢查結果的結構。 –