2011-09-26 44 views
7

我試圖在我的Symfony 2項目中實現Class Table Inheritance Doctrine 2 offer。 比方說,一個有比薩類,Burito類和MacAndCheese類,所有從食品類繼承。Doctrine 2 - 使用Class Table繼承時的訪問級別問題

食品類具有以下設置:

<?php 

namespace Kitchen; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="food") 
* @ORM\InheritanceType("JOINED") 
* @ORM\DiscriminatorColumn(name="dish", type="string") 
* @ORM\DiscriminatorMap({"pizza" = "Pizza", "burito" = "Burito", "mac" => "MacAndCheese"}) 
*/ 
class Food { 

/** 
* @ORM\Id 
* @ORM\Column(type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

而且繼承類的這些設置(比薩爲例):

<?php 

namespace Kitchen; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="food_pizza") 
*/ 
class Pizza extends Food { 

當運行學說: schema:update - 從Symfony 2應用程序/控制檯執行我得到一個關於t的錯誤他訪問的$ ID水平食品比薩爲例)的兒童,說明它必須受到保護或弱。我還沒有宣佈$ ID比薩任何地方,因爲我估計它會從食品繼承。

所以我試圖宣佈$ id,但是這給了我一個錯誤,因爲我無法重新聲明$ id。 我想我需要某種參考的$ id從食品比薩,但原則2文檔沒有真正給我什麼,這將看起來像一個明確的答案。

希望你明白我的意思,並可以幫助我。

回答

4

顯然,我應該已經調查了學說生成的代碼:生成:實體多一點。當我今天早上開始我的IDE,並再次看到代碼,我注意到它「複製」的所有繼承字段(如的$ id食品,在上面的例子中)與兒童(披薩在上面的例子中爲)。

由於某種原因,它決定使這些字段私人。我手動將訪問級別更改爲保護在所有類中,我嘗試運行原則:架構:更新 - 力量再次:它的工作!

因此,在許多情況下,解決方案是一個良好的夜間休息! ;)

如果有人想出了一個更好的解決方案和/或解釋這個問題,請張貼它。我很樂意改變接受的答案。

+0

你是說你的IDE是改變你的字段訪問級別的嗎?這有點嚇人。你使用什麼IDE,以便我可以留意這種情況? – cantera

+0

@ cantera25它不是IDE,它是Symfony 2學說:generate:entities命令。 –

+0

謝謝。它節省了我很多時間。 –

0

東西要記住:

每個實體必須有一個標識符/主鍵。您目前無法在繼承層次中生成 實體作爲解決方案 在爲新實體生成方法時,我從項目 中移除了繼承實體,並在生成後將其移回。

source

+0

謝謝,但據我所知這實際上是關於生成實體,我只是想生成我的數據庫(也許這些方法在內部在Doctrine 2內部相關,但我不知道)。 –

0

可能是你應該以這樣的方式定義@ORM \ DiscriminatorMap:

/** 
* 
.. 
* @ORM\DiscriminatorMap({"food" = "Food", "pizza" = "Pizza", "burito" = "Burito", "mac" => "MacAndCheese"}) 
*/ 

如果從學說網站的例子比較你的代碼,你會看到他們增加了母公司對DiscriminatorMap 。