2012-06-05 73 views
3

因此,當我在相應的模型/控制器中時,afterFind可以正常工作並且很漂亮。但是,在調用關聯模型時,發送到afterFind回調的數據格式不同。這會導致afterFind出來,因爲它無法找到它在原始模型/控制器中工作時所做的相同的數組索引。CakePHP:afterFind與關聯很奇怪

任何人都知道爲什麼,或者是什麼修復?

回答

2

這是afterFind回調的第二個參數。

$primary告訴你,如果找到的是該模型直接()調用,或者如果它是由相關的模型()進行調用。

從書的說明:

的$主參數指示當前模式是否是 該查詢起源於或者判斷這種模式 被質疑爲關聯模型。如果模型被查詢爲 關聯,$結果的格式可能不同;

如果使用遞歸查找 ,則希望$ primary爲true的代碼可能會得到一個「不能使用 字符串偏移量作爲數組」PHP的致命錯誤。

所以,你可能取決於$primary值需要不同的處理邏輯

+0

我檢查主,在2個不同的場景中我得到了初級錯誤,結果結構是不同的。我認爲我能解決這個問題的唯一方式就像人們在這裏建議檢查結果的結構。 –

3

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

或者,您也許可以只檢查模型本身的字段位置。如果該字段不存在於頂層,則需要迭代該組結果。

+0

此外,我發現'$ primary == false'不一定*意味着數據的格式不同,如果它是真的。它可能是,但它取決於發現。 – eaj

+0

那麼這個問題仍然沒有解決?對我來說,有時在Find $ results返回一個多維數組後,有時它返回一個鍵值數組。正如此處所述,$ primary標誌總是爲false,因爲我使用的是可容納的。對這個問題的任何更新將不勝感激。 – vinhboy

+0

我寫了關於CakePHP 1.3的這個答案,但我認爲2.0中沒有任何改變。 唯一的解決方案是檢查是否存在已知密鑰,以確定結果是單個結果還是結果集,並對它們進行適當的操作。 – gapple

1

看來Cake 2.6包含a fix for this,確保所有$results陣列的格式一致。我已經用RC版本做了一些測試,它似乎工作,數組全部以格式{n}.ModelName.data傳遞。

此修復默認情況下處於啓用狀態,但如果需要,您也可以恢復到原有行爲。只需添加以下到您的模型(或AppModel)定義:

public $useConsistentAfterFind = false;