Doctrineの継承。 symfonyのフォームで選択フィールドでそれらを使用するためのすべての子クラス/テーブルを取得する簡単な方法はありますか?
-
23-09-2019 - |
質問
私はただのsymfony 1.4とDoctrineを使用し始めました。 ( - の前に1.2 + Propelの多くの1.0を使用します)。
私はので、高速かつ巨大で、教義を試してみることにしと思いました 過去に開発プロセス。
jwage ;-) とのおかげで
イムテーブル継承を使用します。これは私のschema.ymlのごく一部です。
Articles:
columns:
id:
type: integer(4)
primary: true
notnull: true
autoincrement: true
marken_id:
type: integer(4)
notnull: false
user_id:
type: integer(4)
notnull: false
address_id:
type: integer(4)
notnull: false
...
Vehicles:
inheritance:
extends: Articles
type: concrete
Rennfahrzeuge:
columns:
stvo:
type: boolean
notnull: false
default: false
inheritance:
extends: Vehicles
type: concrete
Tourenwagen:
inheritance:
extends: Rennfahrzeuge
type: column_aggregation
keyField: type
keyValue: 1
...
Sonstige:
inheritance:
extends: Rennfahrzeuge
type: column_aggregation
keyField: type
keyValue: 6
Karts:
inheritance:
extends: Vehicles
type: concrete
TonyKart:
inheritance:
extends: Karts
type: column_aggregation
keyField: type
keyValue: 1
...
Sonstige:
inheritance:
extends: Karts
type: column_aggregation
keyField: type
keyValue: 9
イム今フォームを作成するための簡単な方法を使用して考えます。
ユーザーがあなたのような(フォームの上部にあるフィールドを選択する必要があります http://msm-esv.dyndns.org/frontend_dev:ここに見ることができます。 PHP / fahrzeuge /挿入する )
あなたはRennfahrzeugeやゴーカートなど「親クラス」を選択する必要があります 上のようにします。
ユーザーがTourenwagenなど子クラスを選択するべきであるとした後、Sonstige。
次に、ページをリロードすると、右のフォームが表示されます。
inheritated /子クラスを取得するための教義のいずれかの機能があります 第2の選択フィールドでそれらを表示するための?
(例えば。RennfahrzeugeありTourenwagen、...、...、Sonstigeやゴーカートがあり TonyKart、...、...、Sonstige)
私は、割り当てられたフォームクラスのように動的に作成することができた後、
$chooseMode = $request->getParameter('chooseMode').'Form';
$modeFormClass = new $chooseMode();
または私はちょうど親に右モデルを設定することについて考えています フォームクラス。
あなたの考えは何ですか?私は本当に任意の提案をいただければ幸いですし、 ヘルプ:-)
どうもありがとう、
マルコ
解決
などDoctrineのgetSubclasses
やPHPのget_children_of
などの直接の機能はありますか?私は教義やPHPで、全体で来ていないということ。私が知っている最も近いPHP関数 is_subclass のですこれはあなたが可能なクラスの全てを反復しながら、使用することができます。
あなたのサブクラスでは、あなたのメインモデルから大幅に異なるのですか?私は上記のあなたの例では1つの列の変化を見るだけでなく、私はそれがちょうど簡潔にするためだった推測してます。
私はあなたがしようとしている構造の魅力を実現するが、それは長期的には信じられないほどの痛みをすることができようにそれもそうです。代わりに、ネストされた構造を提供するために、自分自身を参照して、あなたのVehicleCategory
は、これらのカテゴリに属していることができることを別のVehicles
モデルを設定することは可能でしょうか?これは、トップレベルカテゴリとしてのRennfahrzeuge のを持っているとのTourenwagen と Sonstige はのRennfahrzeuge のの親を持つカテゴリのだろうと考えすべての3つに属するVehicles
。あなたの子供のモデルにあまりにも多くのフィールドの変化を持っていなかった場合は、適切な時にそれらを設定/ Vehicles
モデルとだけ表示にカスタムフィールドのすべてを含めることができます。
ただ、いくつかの考え、お役に立てば幸いです。
他のヒント
あなたは
を使用することができます
$yourSuperObject->getTable()->getOption('subclasses')
または
Doctrine::getTable('SuperClass')->getOption('subclasses');