0

當doctrine爲一個表格建立模型文件時,它會生成三個文件,實質上是BaseModel.class.php,Model.class.phpModelTable.class.php。常識要求對Model.class.phpModelTable.class.phpBaseModel.class.php進行任何修改。在Symfony的Doctrine ORM文件Model.class.php和ModelTable.class.php之間進行選擇

但是你什麼時候選擇Model.class.php vs ModelTable.class.php。從我收集的是Model.class.php是爲單個實例和ModelTable.class.php爲多個實例。

任何人都可以在這裏發光嗎?

回答

2

很簡單!

假設您有一個模型稱爲文章。你將有三類稱爲BaseArticle.class.phpArticle.class.phpArticleTable.class.php

這裏是每個類的定義:

BaseArticle.class。 php:這個類有你的模型定義(或你的表定義)。你不想編輯這個類永遠!

Article.class.php:是一個可以爲您的模型編寫替代方法的地方。當您擁有文章類的實例時,您只能訪問這些功能。 所以你只能通過一個對象來調用它們。例如:

class Album extends BaseArticle { 

    public function getSummary(){ 
     .... 
    } 

} 

使用它,你應該這樣做:

$article=new Article(); 
$article->getSummary(); 

ArticleTable.class.php:這是你想要編寫功能,這些功能爲您的整個文章talbe (或者最好對整個文章模型說)。 考試你想找到最受歡迎的文章,你不能寫這個函數到你的文章類,因爲它只適用於一個對象。但是你想在你的桌子上做這個。所以:

class AlbumTable extends Doctrine_Table { 
    public static function getPopularArticles() { 
    } 
} 

,你必須使用這樣的,如果你的職責是靜態的:

ArticleTable::getPopularArticles(); 

,如果你的函數不是靜態的,你可以使用打電話給他們:

Doctrine_Core::getTable('Product')->your_nonstatic_function(); 
+0

也爲什麼你說ArticleTable功能/方法必須是靜態的?我在這裏有幾個方法不是靜態的,但工作正常。 – user1020069 2012-08-01 18:42:36

+1

,因爲你想在沒有Instantiation的情況下調用這些函數,在這種情況下,你的函數應該是靜態的。否則您可以使用ArticleTable :: getXXX() – Firouziam 2012-08-01 19:06:03

+1

Firouziam訪問它們,您將ArticleTable的實例與Article的實例混淆。 Table方法的許多(如果不是大多數)用法不是靜態的。要調用非靜態Table方法,你應該使用我在我的答案中包含的代碼:Doctrine_Core :: getTable('Product')這將檢索表類的一個實例,以允許調用非靜態函數。 – Omn 2012-08-07 20:30:31

0

你會在官方文檔Model Classes找到一個很好的答案。

基本上,約Model.class.php

Model是對象CLASSE表示在數據庫中的記錄。他們可以訪問記錄的列和相關記錄。這意味着您可以通過調用Model對象的方法來了解模型的標題。

對於ModelTable.class.php

ModelTable是表CLASSE;也就是說,包含用於在表格上操作的公共方法的類。它們提供了一種從表中檢索記錄的方法。他們的方法通常返回一個對象或相關對象類

而且BaseModel.class.php的對象的集合:

Base類存放在lib/model/doctrine/base/目錄是從模式直接生成的。你不應該修改它們,因爲模型的每個新構建都會完全擦除這些文件。

+0

所以實質上,當我想要檢索單個記錄的列時,我會在Model.class.php中對它們進行編碼,並且當我想要檢索多個記錄時,我會將它們編碼到ModelTable.class.php中。它是否正確? – user1020069 2012-07-30 19:04:40

+0

是的,你是對的。 – j0k 2012-07-30 20:35:45

3

J0k的答案是資料性的,但並沒有真正以外行人的方式回答這個問題。 ESP。關於單個問題和多個問題。

區別並不是真正的單一對多個實例,而是更多的實例化與未實例化。

得很乾脆:

您可以使用表功能,當你還沒有要讀取或操縱對象的實例。

如果您已經擁有該對象的實例並且想要保存該對象,對其進行更新或檢索關於該對象的更多信息(相關對象),則可以使用該類函數。

通常情況下,具有良好的設計,您將需要創建兩個普通類方法和表法方法:

通常表函數從類功能

更爲複雜訪問。

假設你有一個一個客戶一對多的關係,以購買(其中有一個一對多的關係,以產品)

說你想寫一個方法或獲得所有客戶的產品。

在Customer.class.php

創建:

public function getProducts(){} 

您在普通班創建這個,因爲你只關注一個什麼樣的產品客戶擁有,一旦你有你的客戶

這可以稱之爲是這樣的:

Doctrine_Core::getTable('Product')->getByCustomerId($this->get('id') 

在這裏,你可能沒有任何產品實例,但你要找回它們,所以這應該在表類去。

爲什麼這不會簡單分解爲單一對多個: 如果您要製作一項功能來退回屬於客戶的所有產品。您可能正在處理多個產品,但您不希望僅在表格中創建您的功能。您可能需要向您的付款處理商進行API調用,您可能需要檢查每種產品的退款期限等。

相反,您創建表函數來檢索正確的數據,然後通過創建類函數來處理該數據。

請注意,我發現優秀的程序員一直都會得到這個'錯誤'。這通常歸結爲個人風格問題。

相關問題