多対多の関係をお勧めする理由を教えてください。 シリーズとイベント。私はこれが なので、これは 'オプションの' の関係ですが、私はまだ少しです これがなぜより複雑になるのか混乱しています
実際、私は混乱しました!最近は、構造化の必要性や参照整合性の最大化のために、これが理にかなっている混合型の継承を多く使用しています。 、
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