2017-01-16 18 views
0

私はlaravel 5.3を使用していると私は2つのモデルLaravel 5.3でPolymorphic relationshipを使用するには?

  1. ロボットを持って

    を次のように私はシナリオを持っている

  2. 場所

ロボットは、多くの場所を持つことができますが、場所が属することができますロボットが1台のみになり、ロボットに新しい場所があるたびにカウントフィールドが増分します

私はLaravelとEloquentとの多形関係を使いたいと思っています。私はすべてのロボットのLocationsをdistinct()を使って最後に更新したいと思っていますか?

ところで、ロケーションテーブルのLocatable_idは、ロボットIDを参照しています。ここに私のモデルがある

ロボットモデル

public function locations() { 
     return $this->morphMany('App\Models\Location', 'locatable'); 
    } 

場所モデル

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

}

位置表

enter image description here

どんな助力も本当に感謝しています。ありがとう。

+0

ありがとうございましたか!各ロボットが単純に1:Nの位置を必要とする場合。 –

+1

確かに、Robot-Locationsは私にとっては1対多のようです。 – JoeriShoeby

答えて

0

以下のクエリはすべてのロボットを返し、それぞれのロボットは最新の位置情報を返します。内部関数は、locationsデータをフィルタリングするために使用できます。

Robot::with(['locations' => function($q) { 
    $q->latest(); 
}])->get(); 


私がしようとしていますが、私は Laravelと雄弁に多形関係を使用したいということですが、私は により、すべてのロボットのすべての場所を取得したい最後の明確な使用して更新()?

これは完全にあなたの目標に達するわけではありませんが、これは始めるのが良い点だと思います。ここで

+0

多くのオブジェクトが場所を持つ可能性があるため、1対多の多形関係です。たとえば、ユーザーが1つの場所を持つ可能性があります。顧客は多くのロボットと多くのユーザーを持つことができるため、たとえば顧客の住所保持者として「場所」を使用できます。 –

+0

可能な限り早く回答を編集します。あなたの目標を達成するのは難しいことではありません。 –

+0

これは、Tinker App \ Models \ Location :: distinct( 'locateable_id') - > get(['updated_at']) - > all();を使用して試しています。 –

1

は、私はそれを解決なかった方法です:)

// Grap all Robots with it's locations and Customer 
    $robots = Robot::whereHas('locations', function($query){ 
    $query->whereNotNull('locatable_id')->orderBy('updated_at'); 
    })->with('locations')->with('customers')->get(); 

//Filter only latest Locations for each Robot 
    $filterLocations= $robots->map(function($robot){ 
    $robot->timeEntries = $robot->locations() 
     ->orderBy('updated_at', 'DESC') 
     ->limit(1) 
     ->get(); 
    return $robot; 
    }); 

手伝いのためのあなたの支出の時間に感謝:) あなたはポリモーフィックな関係を使用したくない理由あなたは私を説明することができ、あなたにsamuele-colombo

+0

私はあなたに嬉しいです。私はあなたの解決策がよりエレガントになると思います(おそらく、最初の文で直接「場所」をフィルタリングすることができます)。 –

+0

http://stackoverflow.com/questions/30231862/laravel-eloquent-has-with-wherehas-what-do-they-meanによると、 'whereHas'は(_notがなく、 updated_at_) 'Locations'ですが、' with'メソッドでそれらを直接フィルタリングできると思います。 –

関連する問題