2010-11-29 12 views
0

私はDoctrineで作業しているプロジェクトのモデルを設計することを実験しています。異なる関係を定義する方法についていくつかのアドバイスが必要でした。私は3つのテーブルDoctrineで関係を定義する

会場を持って

、シリーズおよびイベント

  • 会場には多くのイベントがあり、必ずしも時々ではなく、シリーズの一部であるイベントを開催することができます。
  • シリーズは、同じ会場または異なる会場で常に発生する一連のイベントです。
  • イベントは常に会場で発生する必要があり、オプションでシリーズの一部になることができます。

多くの会場では多くの一連のイベントを開催することができますし、その逆もありますので、会場とシリーズは多対多の関係になると私は理解しています。この関係が「オプション」であるという事実が変化しますか?

私はまた、1つの会場には多くのイベントを持つことができ、1シリーズは、多くのイベントを持つことができますが、イベントはそれぞれ1つだけを持つことができるように、そのイベントが会場とシリーズの両方で一対多の関係だろう理解しています。

は、私がこれで正しい方法を探しています、と誰もが教義の中にこれを定義するための最良の方法についてアドバイスすることができますか?

答えて

2

多対多の関係をお勧めする理由を教えてください。 シリーズとイベント。私はこれが なので、これは 'オプションの' の関係ですが、私はまだ少しです これがなぜより複雑になるのか混乱しています

実際、私は混乱しました!最近は、構造化の必要性や参照整合性の最大化のために、これが理にかなっている混合型の継承を多く使用しています。 、

Event: 
    columns: 
    name: string(255) 
    venue_id: integer 
    series_id: {type: integer, default: null} 
    relations: 
    Venue: 
     local: venue_id 
     type: one 
     alias: Venue 
     foreign: id 
     foreignType: many 
     foreignAlias: Events 
     onDelete: CASCADE 
    Series: 
     local: series_id 
     type: one 
     alias: Series 
     foreign: id 
     foreignType: many 
     foreignAlias: Events 
     owningSide: true 
     onDelete: SET NULL   

Venue: 
columns: 
    name: string(255) 
    # other cols 

Series: 
    columns: 
    name: string(255) 
それでもしかし

ミリメートルを使用すると、refClassに特定のデータを追加することができますか:あなたは同じように簡単に(あなたがそれを述べたように、モデルの要件により、インラインである)私が考える次のことを行うことができます基本的に同じ関係のために複数の参照クラスを使用することができます(これは、特定の状況でこのようにするのが便利な場所です)。だから、技術的にはそのより柔軟な、しかし、あなたが述べたものを、あなたの唯一の要件はなかった確かならば、あなたはまた、

:-)この柔軟性が必要ことは決してないだろう、これは 多対多の関係であるという事実でありますその は、特別なSeriesEvent refClassを定義する必要がありますか?

はい。それから、上構築するには

、それは多対多 が発生するたびに、この追加の参加 を定義するために必要な のですか?

doctrineは、コレクションのアクセサを呼び出すたびに自動的にクエリーを処理しません。しかし、1-mとm-mの両方の場合、照会にジョインを追加して、アクセサを呼び出すたびにdbに再度照会する必要がないことがよくあります。例えば:関係は常にイベントに依存しますので、

$events = Doctrine_Core::getTable('Event')->createQuery('e')->execute(); 
foreach($events as $event){ 

    // each of the following will query the db so you have 
    // 2*(number of events) queries being issued to the DB in this loop 

    $series = $event->getSeries(); // this will join through the ref class automatically 
    $venue = $event->getVenue(); 
} 

$events = Doctrine_Core::getTable('Event')->createQuery('e') 
    ->leftJoin('e.Series s) // this will join with the ref class automatically 
    ->leftJoin(e.Venue v) 
    ->execute(); 

foreach($events as $event){ 

    // because you explicitly joined the realtion all the data 
    // fetched at once, so this entire loop only uses 1 query. 
    $series = $event->getSeries(); 
    $venue = $event->getVenue(); 
} 

私は、このように相関関係は必要ありませんシリーズと全く会場を関連付けるwouldntは。クラスに独自のカスタムアクセサ/ミューテータ/ファインダを追加して、3次関係を問い合せたり、適切な関連オブジェクトからプルすることができます。さらに、EventとSeriesの関係はオプションであるため、多対多を使用するのは最も柔軟性があるからです。

次のような何か:

Event: 
    columns: 
    name: string(255) 
    venue_id: integer 
    relations: 
    Venue: 
     local: venue_id 
     type: one 
     alias: Venue 
     foreign: id 
     foreignType: many 
     foreignAlias: Events 
     onDelete: CASCADE 
    Series: 
     local: event_id 
     alias: Series 
     refClass: SeriesEvent 


Venue: 
columns: 
    name: string(255) 
    # other cols 

Series: 
    columns: 
    name: string(255) 
    relations: 
    Events: 
     local: series_id 
     alias: Events 
     refClass: SeriesEvents 

SeriesEvent: 
    columns: 
    event_id: {type: integer, primary: true} 
    series_id: {type: integer, primary: true} 
    relations: 
    Series: 
     local: series_id 
     type: one 
     alias: Series 
     foreign: id 
     foreignType: many 
     foreignAlias: SeriesEvents 
     onDelete: CASCADE 
    Event: 
     local: event_id 
     type: one 
     alias: Event 
     foreign: id 
     foreignType: many 
     foreignAlias: SeriesEvent 
     onDelete: CASCADE 
関連する問題