2017-12-29 31 views
1

Ich habe benutzerdefinierte Modell-Versionierung in Laravel Framework implementiert. Es gibt ein paar Spalten, die es in der Datenbanktabelle behandeln: sibling_id (verbindet die verschiedenen Versionen des Modells), version, accepted und validFrom.Laravel nur Modelle mit aktueller Version

Zum Beispiel:

| 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 |  | 

Was ich mit aktuellen Modellen bedeuten:

  • Modell die größte Versionsnummer innerhalb der anerkannten und gültigen Modalverben mit
  • OR Version 1, wenn ‚isn t andere Versionen

Ich hätte gerne einen Weg, um nur das aktuelle Modell zu bekommen, gruppiert nach sibling_id (in diesem Beispiel sollte die Kollektion die Modelle 1, 3 und 5 enthalten). Dies sollte genauso funktionieren wie Laravels withTrashed()-Funktion, so dass ich alle hinzufügen kann, wenn ich möchte (zum Beispiel Versionsgeschichte).

Vielleicht kann dies irgendwie mit den Bereichen getan werden, aber ich fühlte es kompliziert wegen der "Geschwistergruppierung" und einem anderen komplexen Filter, so endete ich hier zu fragen.

Vielen Dank im Voraus.

Antwort

0

Ich denke, eine SQL-Ansicht wäre einfacher zu arbeiten, als die Abfrage mit Laravel zu bauen.

würde ich eine Ansicht der Umsetzung der Abfrage etwas bauen zusammen:

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; 

Dann in Laravel für die Ansicht ein weiteres beredtes Modell abzubilden. Auf diese Weise können Sie nur aus der Tabelle auswählen, wenn Sie alle erhalten möchten, oder aus der Ansicht, wenn Sie "eindeutige" Datensätze wünschen.