2017-10-06 3 views
0

J'ai deux tables: statuts et status_logs.Laravel 5/Eloquent - Retourne une date Basé sur le created_on Colonne Plus Variable Heures

Le états table a 3 colonnes: id, nom, durée

Le status_logs tableau a 3 colonnes: id, status_id, created_at

J'ai deux modèles qui ressemblent à ceci:

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'); 

    } 

} 

Je peux obtenir des données des deux tables en utilisant:

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

Le résultat ressemblerait à quelque chose comme:

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

Je voudrais ajouter une colonne appelée finish_at à chaque objet à l'intérieur du tableau status_logs. Cette date/heure sera la valeur created_at plus n'importe quelle valeur entière de durée est. Durée est le nombre d'heures que nous devons ajouter à created_at pour obtenir la valeur de finish_at.

Le résultat devrait ressembler à:

"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 
    } 
}] 

Comment puis-je faire cela?

Répondre

1

Utilisez Eloquent appends pourrait résoudre ce problème.

Ajouter un attribut supplémentaire et définir la valeur. Ce serait ressembler à quelque chose comme ci-dessous.

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

La première étape est Devide la durée de 24 puis ajoutez la durée en valeur created_at dispositifs utilisant en utilisant en utilisant du carbone comme celui-ci.

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