0

私は次の設定をしています:

クラブは特定のタイプのアクティビティを提供するため、関係を持つ 3 つのモデル:

クラブ:

function activities()
{
    return $this->hasMany('Activity');
}

アクティビティ:

function club()
{
    return $this->belongsTo('Club');
}

function activityType()
{
    return $this->hasMany('ActivityType');
}

アクティビティの種類:

function activities()
{
    return $this->belongsToMany('Activity');
}

たとえば、クラブ フーには「トライアスロン」という 1 つのアクティビティがあり、そのアクティビティには「水泳」、「ランニング」、および「サイクリング」というアクティビティ タイプがあります。

これで十分ですが、クラブ ページに ActivityTypes のリストを表示する必要があります。基本的には単なるリストです。したがって、関連するすべてのアクティビティの ActivityTypes を取得する必要があります。

これは、Club モデルのインスタンスを受け取るコントローラー メソッドから行うことができます。

$data = $this->club->with(array('activities', 'activities.activityTypes'))->find($club->id)

これにより、関連するすべてのアクティビティと、それらに関連する ActivityTypes を含むオブジェクトが取得されます。また、十分に公平です。しかし、さらにフィルタリングを適用する必要があります。アクティビティは適切なステータスではない可能性があります (ドラフト エントリとして DB にあるか、有効期限が切れている可能性があります)。そのため、ライブで将来のアクティビティの ActivityTypes のみを取得できる必要があります。

この時点で私は迷っています...このユースケースを処理するための提案はありますか?

ありがとう

4

2 に答える 2

1

フィルタリングするwhere()には、流暢な DB クエリのように使用できます。

$data = Club::with(array('activities' => function($query)
{
    $query->where('activity_start', '>', DB::raw('current_time'));

}))->activityType()->get();

これにインスピレーションを与えた例は、laravel ドキュメントにあります。このセクションの最後を確認してください: http://laravel.com/docs/eloquent#eager-loading

(コードはテストされていないので、プロパティ名には多少の変更を加えました! :) )

于 2013-08-05T16:59:43.377 に答える