2011-05-24 84 views
1

我正計劃使用Cakephp製作一個網站,而其中一個「請求者」正在數據庫中使用繼承。示例繼承Cakephp

父實體假裝具有共同屬性,但最重要的是傳遞給其子實例的id(鍵屬性) ,這當然有它們自己的一組屬性。

Cakephp支持此功能嗎?如果是這樣,任何人都可以提供一個使用繼承的簡單例子嗎? (不是多重繼承順便說一句)

我會感謝您的答案。

+0

哇!多謝你們。我可以看到有很多方法可以解決這個問題。但是他們所有的人似乎都是壓倒性的,至少對於像我這樣的蛋糕小夥子來說。您可以發佈示例代碼或教程鏈接嗎? – CTime95 2011-05-24 17:53:16

+0

我想知道如果你在Cakephp中深入挖掘自己,你是否仍然需要OOP風格繼承或者ORM HasOne,HasMany功能在你的主題中描述的有效。 – Andrewboy 2017-08-07 20:04:22

回答

0

雖然我不認爲它直接支持它,但你可以使用一些Set類的魔法。其中最令人敬畏的類之一。

http://book.cakephp.org/view/1487/Set

http://book.cakephp.org/view/1508/merge

,如果它是很簡單的東西,你在做什麼,array_merge()會爲你做它太

您將能夠輕鬆地創建行爲,在afterFind()回調中做到這一點,以便它在一個地方透明地完成,並準備好爲您的視圖做一個正常的$ this-> Model-> find('all')等等

+0

我不太明白這一點,尤其是如果你面對的是CRUD。你能用一個簡單的示例代碼來解釋這個嗎? – CTime95 2011-05-24 18:04:41

0

你可能會考慮使用Doctrine作爲ORM,它通過柱聚集支持繼承: http://dqminh.com/integrate-doctrine-orm-with-cakephp-part-1

+0

他指出了cakephp:如果你能得到Doctrine與Cake的關係系統一起工作,我會給你回票。 – 2011-05-24 23:25:06

+0

提供的鏈接簡單地通過組合加載原則到appModel中 - 它沒有關係支持,沒有驗證支持,也沒有像通常的蛋糕orm那樣找到語法糖。如果他設法支持的不僅僅是簡單地將供應商作爲供應商,並且告訴模型不使用蛋糕數據源,那麼這可能是一個可行的解決方案。看起來他要麼沒有計劃進一步實施,要麼還有很長的路要走。 – 2011-05-25 14:20:39

0

http://bakery.cakephp.org/articles/taylor.luk/2008/10/22/inheritable-behavior-missing-link-of-cake-model

這是寫入前一段時間的行爲 - 這可能是舊的,但它應該給你一個瞭解如何使用Cake管理STI(單表繼承)的非常好的基礎。

** **編輯

從我掛的文章 - 這可能不是當前或工作代碼。我提到它是您制定自己的行爲代碼的起點。

該類型是由類類型推斷的 - 並且您正在討論的結構僅適用於單表繼承類型的設置。確保你正在像示例顯示那樣進行父類的導入。 IE:

<?php 
    ... 
    App::import('Model', 'Person'); 
    class Manager extends Person 
    { 
     ... 
    } 
?> 
+0

我用一個簡單的例子嘗試了這個,但仍然不起作用。他們說你必須在父表上使用var char屬性'type'。那樣,Cakephp會'自動'檢測你指的是哪個子類。你是否必須像外鍵一樣手動配置? :S – CTime95 2011-06-03 21:04:06

+0

就像我說的 - 代碼可能不起作用。這是非常古老的 - 但它是你需要的想法。你可以查看它,並找出它應該做什麼,併爲你的版本的蛋糕修復它。 – 2011-06-06 16:15:50

0

我是CakePHP的新手(正如一週的經驗值),但遇到了同樣的問題。正如已經在這裏暗示的那樣,看起來構圖是最常用的模型擴展方法(正如你在使用Has-A而不是Is-A的評論中提到的那樣)。

這裏就是我想和希望工程我比較簡單的用例:

//'Super Class' 
class Log extends AppModel { 
    var $name = 'Log';  
} 

//'Sub Class' 
class SharedLog extends AppModel { 
    var $name = 'SharedLog'; 
    var $hasOne = 'Log'; 
    var $validate = array(
     'log_id' => array(
      'logRule-1' => array(
       'rule' => 'notEmpty', 
      ), 
      'logRule-2' => array(
       'rule' => 'isUnique', 
      ) 
     ) 
    ); 
} 

我希望這GET的接近什麼人會需要一個子類的事。當您明確要求使用SharedLog時,您將有權訪問Log屬性。如果您從日誌的角度提出請求,您將無法訪問任何SharedLog擴展屬性(但這很有意義,因爲如果您正在瀏覽一組日誌,則不知道哪些是超類,哪些是超類是子類)。

我認爲validate變量足以防止數據庫中的孤兒和重複。

說到數據庫,我走了出來,讓shared_logs表沒有id列,而是使用log_id作爲主鍵。我很想得到關於這個設置的一些反饋,因爲我對這個框架完全陌生,並且在代碼「在這種情況下感覺錯誤」的時候沒有第六感。

編輯:我只是想,假設我不完全去這個錯誤的方式(我想我認爲我不是)這個解決方案提供了一個非常簡單的方法來做一個實例超級類成爲子類的一個實例。由於日誌只有在創建之後才能共享。這可能只是讓我從一開始就應該一直在思考組合問題。