2011-09-26 6 views
7

私はsymfony 2プロジェクトでDoctrine 2の提案をClass Table Inheritanceに与えるつもりです。 のは、ピザクラス、Buritoクラスとすべてが食品クラスから継承MacAndCheeseクラスがあるとしましょう。 教義を実行している場合Doctrine 2 - クラステーブルの継承を使用する際のアクセスレベルの問題

<?php 

namespace Kitchen; 

use Doctrine\ORM\Mapping as ORM; 

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

<?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; 

と継承されたクラスは、これらの設定(例えばピザ)を持っている:

食品クラスには、次の設定があります。スキーマ:アップデート - symfony 2アプリケーション/コンソールからのの更新彼はそれが保護または弱いしなければならない旨、食品例えばピザ)の子どもたちにます$ idのレベルにアクセスします。私はそれが食品から継承されます侮れので、私は、どこにでもピザます$ idを宣言していません。

$ idと宣言しようとしましたが、それはエラーです。原因は$ idを再宣言できないためです。 私は食品ピザから$ IDへの参照のいくつかの種類が必要に理解が、教義2ドキュメントは本当に私にこれがどのように見えるかについて明確な答えを与えていません。

あなたは私が何を意味しているのかを理解して助けてくれることを願っています。心に留めておくべき

答えて

4

どうやら私は教義によって生成されたコードを調べておく必要があります生成:エンティティもう少し。私は今朝、私のIDEを開始し、もう一度コードを見ると、私はそれは(子供たちに(上記の例では、同様$ ID食品に)継承されたすべてのフィールドピザを「コピー」していたことに気づきました上記の例では)。

これらのフィールドを何らかの理由でをプライベートにすることにしました。私は手動でアクセスレベルをに変更し、すべてのクラスでを保護しました。私は実行しようとしましたdoctrine:schema:update --forceもう一度:それは働いた!

多くの場合のように、解決策は良い夜でした! ;)

誰かがこの問題についてより良い解決策や説明を提示した場合は、投稿してください。私は受け入れられた答えを変更することを嬉しく思っています。

+0

あなたのIDEはあなたのフィールドのアクセスレベルを変更するものだと言っていますか?それは一種の恐ろしいことです。どんなIDEを使っているのですか?私はそれに気づいていますか? – cantera

+0

@ cantera25これはIDEではなく、Symfony 2のdoctrine:generate:entitiesコマンドを使っていました。 –

+0

ありがとうございます。それは多くの時間を節約しました。 –

0

何か:

すべてのエンティティは、識別子/主キーを持っている必要があります。継承階層で現在 エンティティを生成することはできません(ベータ版)新しいエンティティのメソッドを生成する際に回避策として を作成すると、プロジェクト を継承し、生成後に元に戻しました。

source

+0

ありがとうございますが、これは実際にエンティティを生成することに関するもので、私はデータベースを生成したいと思います(おそらくこれらのメソッドはDoctrine 2の内部で関連していますが、わかりません)。 –

0

あなたは、このような方法で@ORM \ DiscriminatorMapを定義すべきである場合があります。

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

あなたはDoctrineのサイトから例を使用してコードを比較した場合、あなたは彼らがDiscriminatorMapに親エンティティを追加したことを確認できます。

関連する問題