2011-04-03 28 views
0

我正在使用一個遺留數據庫,它的關鍵字遵循一個約定,但不幸的是,這不是蛋糕約定,而且我遇到了一些與可容忍行爲有關的奇怪事情 - 它們拉錯了數據。這裏是我的設置:非標準密鑰的可行性問題?

TechnologyIncentive belongsTo... 
    array(
    'Incentive' => array(
     'className' => 'Incentive', 
     'type'  => 'inner', 
     'foreignKey' => false, # actually 'incentive_id', but we need to fool Cake 
     'conditions' => array('TechnologyIncentive.incentive_id = Incentive.incentive_id'), 
    ), 
    'Technology' => array(
     'className' => 'Technology', 
     'type'  => 'inner', 
     'foreignKey' => false, # actually 'incentive_tech_id', but we need to fool Cake 
     'conditions' => array('TechnologyIncentive.incentive_tech_id = Technology.incentive_tech_id') 
    ), 
); 

你可以看到,我已經有愚弄蛋糕到由foreignKey設置爲false,並確定在我的where子句中的鏈接與我的非標準鍵的工作。到現在爲止還挺好。

現在,當我嘗試運行從TechnologyIncentive型號查詢:

$this->find('all', array(
    'contain' => array('Incentive', 'Technology'), 
    'fields' => array('Incentive.name', 'Technology.name', 'TechnologyIncentive.amount'), 
    'conditions' => array(/** conditions... */) 
); 

一切都很正常。東西很好包含,我得到了我期望的。然後我需要包含一個TechnologyGroup,其中hasMany Technology和事情由於某種原因而崩潰。現在

contain選項如下:

'contain' => array('Incentive', 'Technology' => array('TechnologyGroup')) 

而我得到的回覆是一個Incentive記錄中包含的優惠記錄。這並不令人感到意外,因爲我在一個地方指定了幾個字段(主要是fields選項),並且隱含地選擇了contain選項中的所有字段,但真正對我來說很奇怪的是它們是不同的激勵。 「包含」的激勵措施是錯誤的。

檢查SQL,它看起來像查詢運行時沒有任何有效的where子句,所以一切都被拉動,然後人爲限制爲一條記錄。請注意0​​和$result['Incentive']['Incentive']['incentive_id']之間的差異。

Array 
(
    [Incentive] => Array 
    (
     [incentive_id] => MD046 
     [name] => Incentive name 
     [category] => 
     [Incentive] => Array 
     (
      [incentive_id] => AK004 
      [code] => AK04F 
      [version] => 2 
      [category] => Incentive Category 
     ) 

    ) 
) 

有沒有人碰到過這個?直到我想檢索一個擴展記錄(TechnologyGroup),這不是問題。任何想法將不勝感激。

回答

0

看起來這是直接歸因於非標準鍵。可遏制的行爲,似乎更多的是,蛋糕真的的其他元素希望接下來的慣例。此外,一些重要的關聯在字段名稱中包含雙下劃線(__),並導致其他問題。

孩子們,不要在家裏試試這個。遵循約定,即使它意味着操縱遺留數據庫。