私はid(主キー)、event_id、event_type(文字列)を持つcomponent_eventsテーブルを持っています。Laravel条件付きbelongsTo
誤った関係が呼び出された場合、間違ったレコードが返されないようにしたいと思います。
私が思い付くことができました唯一のことは、(ComponentEventモデルに)ある...より良い方法であることを
public function AircraftEvent()
{
return ($this->event_type === 'flight') ? $this->belongsTo('AircraftFlightEvent', 'event_id') : $this->belongsTo('AircraftMaintenanceEvent', 'event_id');
}
があります!
私は多相関係のドキュメントを見てきましたが、私はそれを理解していませんし、私の場合はそうではない多くの関係のようです。
私は2つの独立した関係に持っていることを好むだろう...
public function AircraftFlightEvent()
{
return $this->belongsTo('AircraftFlightEvent', 'event_id');
}
public function AircraftMaintenanceEvent()
{
return $this->belongsTo('AircraftMaintenanceEvent', 'event_id');
}
誰かが間違った関係を呼び出した場合、それは誤ったレコードを返すことができます。
私は( 'flight'、$ this-> event_type)を追加しようとしましたが、それはcomponent_eventsテーブルではなく関連テーブルの列を参照します。
私もスコープを試しましたが、LaravelはbelongsTo関係に追加されたスコープが気に入らないようです。
ご協力いただければ幸いです。
UPDATEは
私は、多対多の多型の関係を使用している場合、私は正しい結果とクエリを得ることができることを見出しました。唯一の問題は、ComponentEventは実際には(component_events.event_typeの値に応じて)関連するAircraftFlightEventまたはAircraftMaintenanceEventを1つしか持たないことです。
AppServiceProvider:
public function boot()
{
Relation::morphMap([
'flight' => \AircraftFlightEvent::class,
'maintenance' => \AircraftMaintenanceEvent::class,
]);
}
AircraftFlightEventとAircraftMaintenanceEvent:
public function ComponentEvents()
{
return $this->morphMany('ComponentEvent', 'event');
}
ComponentEvent:
public function AircraftFlightEvent()
{
return $this->morphedByMany('AircraftFlightEvent', 'event', 'component_events', 'id', 'event_id');
}
public function AircraftMaintenanceEvent()
{
return $this->morphedByMany('AircraftMaintenanceEvent', 'event', 'component_events', 'id', 'event_id');
}
唯一の問題は、それを$ component_event-> AircraftFlightEvent(またはメンテナンス)を呼び出すとき単一のインスタンスを含むコレクションを返します。私は単なるインスタンスではなく、コレクションではなく、常に1つのモデルであるためです。
私はmorphOneを使ってみましたが、正しいSQLは生成されません。これは、event_typeが反対の表の列だと考えます。 component_events.event_typeの値のチェックはまったく含まれません。
最終的には、1つのオブジェクトを含むコレクションを返す必要がある場合は... ...しかし、それは正しいことができれば、最初に多態性関係を定義するという目的のほとんどを敗北させます。
この状況では、「多形関係」を使用できます。 https://laravel.com/docs/5.3/eloquent-relationships#polymorphic-relationsをご覧ください。 その場合、 'Comment'には' posts'と 'videos'という2つの異なる型があり、' AircraftFlightEvent'と 'AircraftMaintenanceEvent'型の' ComponentEvent'があります。 – MarcosRJJunior