2017-10-06 3 views
0

Ich habe zwei Tabellen: Status und status_logs.Laravel 5/Eloquent - ein Datum basierend auf der created_on Spalte plus Variable Stunden

Die Status Tabelle hat drei Spalten: id, Name, Dauer

Die status_logs Tabelle hat drei Spalten: id, status_id, created_at

Ich habe zwei Modelle, die so aussehen:

class Status extends Model{ 

    // Name of our database table 
    protected $table = 'statuses'; 

    // Defines the relationship between this table and the status_logs table 
    public function status_logs(){ 

     return $this->hasMany('App\Models\Status', 'status_id'); 

    } 

} 

class StatusLog extends Model{ 

    // Name of our database table 
    protected $table = 'status_logs'; 

    // Defines the relationship between this table and the statuses table 
    public function statuses(){ 

     return $this->belongsTo('App\Models\Status', 'status_id'); 

    } 

} 

Ich kann Daten aus beiden Tabellen erhalten, indem mit:

StatusLog::with('status')->get(); 

Das Ergebnis wäre wie etwas aussehen:

"status_logs": [{ 
    "id": 1, 
    "status_id": 1, 
    "created_at": "02:34:53 10/5/2017", 
    "statuses": { 
     "id": 1, 
     "name": "started" 
     "duration": 48 
    } 
}] 

Ich mag wäre eine Spalte finish_at aufgerufen hinzufügen jedes Objekt innerhalb der status_logs Array. Dieses Datum ist created_at Wert plus was auch immer der ganzzahlige Wert von Dauer ist. Dauer ist die Anzahl der Stunden, die wir zu created_at hinzufügen müssen, um den Wert finish_at zu erhalten.

sollte das Ergebnis wie folgt aussehen:

"status_logs": [{ 
    "id": 1, 
    "status_id": 1, 
    "created_at": "02:34:53 10/5/2017", 
    "finish_at": "02:34:53 10/7/2017", 
    "statuses": { 
     "id": 1, 
     "name": "started" 
     "duration": 48 
    } 
}] 

Wie würde ich das tun?

Antwort

1

Verwenden Eloquent appends dieses Problem lösen würde.

Fügen Sie ein zusätzliches Attribut hinzu und definieren Sie den Wert. Es würde ungefähr wie unten aussehen. unter Verwendung unter Verwendung von Kohlenstoff wie dieser

class StatusLog extends Model 
{ 
    protected $appends = ['finish_at']; 

    public function getFinishedAtAttribute() 
    { 
     // carbon to add hours 
     $dt = Carbon::instance($this->attributes['created_at']); 

     $dt->addHours($this->statuses->duration); 

     return $dt->toDateTimeString(); // change to your desire format 
    } 
} 
0

Erster Schritt ist die Dauer in Devide 24. dann die geteilten Dauer in created_at Wert.

$log->finished_at = $log->created_at->addDays($log->statuses()->duration/24); 
$log->save(); 
Verwandte Themen