2016-10-17 10 views
0

私は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つのオブジェクトを含むコレクションを返す必要がある場合は... ...しかし、それは正しいことができれば、最初に多態性関係を定義するという目的のほとんどを敗北させます。

+0

この状況では、「多形関係」を使用できます。 https://laravel.com/docs/5.3/eloquent-relationships#polymorphic-relationsをご覧ください。 その場合、 'Comment'には' posts'と 'videos'という2つの異なる型があり、' AircraftFlightEvent'と 'AircraftMaintenanceEvent'型の' ComponentEvent'があります。 – MarcosRJJunior

答えて

1

これは多態性関係の良い原因だと思います。しかし、あなたが言及したように、Laravelのドキュメントは多くのレコードを返すのに役立ちますが、あなたは1つのレコードにマッチする必要があります。 Regular Laravelの文書でカバーされていないmorphOneと呼ばれる関係があり、Laravel Api Documentationで利用可能です。

public function event() 
{ 
    return $this->morphTo(); 
} 

両方ごAircraftFlightEventAircraftMaintenanceEventモデルが持つ必要があります:あなたのComponentEventモデルがそうのような機能を持っている必要があり、この関係を実装するために

public function event() 
{ 
    return $this->morphOne(\App\ComponentEvent::class, 'event'); 
} 

を(あなたは形質にこれを抽出することができますあなたが好きなら)

morphOneリレーションシップの第2パラメータipは、component_eventテーブルの列プレフィックスと一致するために使用されます。したがって、'event'を使用すると、Laravelはテーブル内のevent_idevent_typeの列を探します。

は、今あなたがしなければならないすべては、コール$componentEvent->event()であり、あなたがあなたのAircraftFlightEventAircraftMaintenanceEventモデルの単一のインスタンスではなく、コレクションを持っています$componentEventを持っている場合。

これが役に立ちます。ハッピーコーディング。

+0

AircraftFlightEventと私がそれから取得しようとしているものについて明示的になるように、ComponentEventモデルのAircraftMaintenanceEventメソッド –

+0

私が提案できる唯一の他のものは、文の機能を 'public function AircraftEvent()に変更することです。 { return($ this-> event_type === 'flight')? $ this-> AircraftFlightEvent():$ this-> AircraftMaintenanceEvent(); } '不正なフォーマットのため申し訳ありませんが、コメントで修正することはできません。 – Azeame

+0

「フライト」と「メンテナンス」以外のイベントタイプもあるため、これも問題です。対応するモデルは「フライト」と「メンテナンス」タイプのみです。 –