2017-12-29 56 views
1

私はLaravel Frameworkでカスタムモデルのバージョン管理を実装しました。データベーステーブルでそれを扱ういくつかの列があります:sibling_id(モデルの異なるバージョンをリンクします)、versionacceptedおよびvalidFromです。例えばLaravelは現在のバージョンのモデルのみを取得します

:私は現在のモデルとはどういう意味

| id | sibling_id | version | accepted | validFrom | ... | 
|----|------------|---------|----------|------------|-----| 
| 1 | 1   | 1  | 1  | 2017-12-01 |  | 
| 2 | 1   | 2  | 1  | 2018-06-01 |  | 
| 3 | 2   | 1  | 1  | 2017-12-10 |  | 
| 4 | 2   | 2  | 0  | 2017-12-28 |  | 
| 5 | 3   | 1  | 0  | 2017-12-01 |  | 

  • モデル「があるにISN場合は受け入れられ、有効なモーダル
  • ORバージョン1内の最大のバージョン番号を持ちます他のバージョン

通常、現在のモデルはsibling_idでグループ化されています(この例では、コレクションにはモデル1,3,5が含まれていなければなりません)。これはLaravelのwithTrashed()関数と同じように動作するので、必要ならばすべてを含めることができます(たとえば、バージョン履歴)。

これはどういうわけかスコープで行うことができますが、「兄弟グループ」と他の複雑なフィルタのために複雑に感じたので、ここで質問しました。

ありがとうございます。

答えて

0

Laravelを使用してクエリを作成するのではなく、SQLビューを使用する方が簡単だと思います。

私は、に沿って、クエリ何かを実装するビューを構築したい:

select t.* from table as t 
    join (select sibling_id, MAX(version) as version from table group by sibling_id) as grouped 
     on grouped.sibling_id = t.sibling_id and t.version = grouped.version; 

はその後Laravelにビューの別の雄弁なモデルをマッピングします。こうすることで、すべてを取得したい場合は表から、「一意の」レコードを表示する場合はビューから選択できます。

関連する問題