2016-05-11 17 views
2

アプリケーションのフロントページに通知ストリームを作成します。今、私はニュース、ミーティング、プレゼンテーションのモデルを持っています。これらの要素を1つのオブジェクト(イベントとも呼ばれる)に結合して、最新の5つのイベントを取得してフロントページに表示することができます。すべてのgetTitle、getBodyとGETCREATIONDATEを必要とするインターフェイスを実装複数のオブジェクトからストリーム/フィードを作成するにはどうすればよいですか?

News Article: Submissions open starting April 1 
Presentatiion: How to do stuff, the PDF 
Meeting: April 15, Foo High School Gymnasium 

オブジェクトなので、これらの機能は、各オブジェクトに使用できます。出力は何かのようになります。

単純にコレクションをマージする必要はありません。コレクションが乱雑になります。これらのオブジェクトを単一のオブジェクトに結合する方法はありますか?

答えて

1

継承の古典的なケースのようです。イベントと呼ばれるモデルを作成できます。

class Event extends Model 

次に、前述のクラスでイベントが拡張されます。

class Article extends Event 
class Presentation extends Event 
class Meeting extends Event 

次に、Eventクラスに対してカスタムメソッドを作成できます。私はコレクションをマージすることを避けたい場合は、あなたのケースでEloquentを混乱させるよりも簡単なSQLを書く方が簡単だと思います。

public function getUpcomingEvents() 
{ 
    // something like that, you get the idea 
    return DB::select(' 
     (SELECT title, body, CreationDate FROM articles LIMIT 5) 
     UNION 
     (SELECT title, body, CreationDate FROM meetings LIMIT 5) 
     ORDER BY CreationDate DESC LIMIT 5')->get(); 
} 

これは、コントローラをきれいに保つことができ、モデル構造が基本ロジックを表すようになります。

3

私は@Tadasが言ったことに反すると雄弁はまだpolymorphismを使用して、ここでは最良の選択肢かもしれないと言うつもりです。この方法は、あなたのすべてのイベントは、単一のテーブルに簡単に選択することができ、その後、あなたのモデルはあなたが必要とする特別な情報を保持することができます。

あなたのテーブルは次のように設定しておいてください。この方法は、いくつかの異なる方法であなたを助け

class Event extends Model 
{ 
    /** 
    * Get all of the owning imageable models. 
    */ 
    public function eventable() 
    { 
     return $this->morphTo(); 
    } 
} 

class News extends Model 
{ 
    /** 
    * Get all of the staff member's photos. 
    */ 
    public function events() 
    { 
     return $this->morphMany('App\Event', 'eventable'); 
    } 
} 

class Meeting extends Model 
{ 
    /** 
    * Get all of the product's photos. 
    */ 
    public function events() 
    { 
     return $this->morphMany('App\Event', 'eventable'); 
    } 
} 

  1. がイベントをされる取得

    event 
        title 
        body 
        creation_date 
        eventable_id 
        eventable_type 
    
    news 
        some_other_field1 
    
    meeting 
        some_other_field2 
    

    そして、あなたのモデル本当に簡単。次の5つのイベントがやってきますか? Event::where('event_date', '=>', new DateTime('today'))->orderBy('event_date', 'asc')->take(5);

  2. は、簡単に再利用可能な方法で、異なるモデルのための今後のイベントを取得:

    News:whereHas('events', function($query) { 
        $query->where('event_date', '=>', new DateTime('today'))->orderBy('event_date', 'asc')->take(5); 
    })->get(); 
    
  3. また、あなたはあなたのモデルのすべてで異なるフィールドを持つことができ、継承の利益を得るが、ベースEventモデルができますすべての一般的な情報を保持してください。あなたは、イベントオブジェクトからモデル固有の情報が必要な場合や、あなただけの必要$event->eventable-><whatever field you need>

  4. んが、生のクエリを呼び出すことはありません。すべての場合、通常のLaravel構文をそのまま使用してください。

関連する問題