Laravel 5 / Eloquent - Return 基于 created_on 列加上可变小时数的日期

Laravel 5 / Eloquent - Return a Date Based on the created_on Column Plus Variable Hours

我有两个 table:statusesstatus_logs

statuses table 有 3 列:id, name, 时长

status_logstable有3列:id,status_id,created_at

我有两个模型是这样的:

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

    }

}

我可以使用以下方法从两个 table 获取数据:

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

结果类似于:

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

我想向 status_logs 数组中的每个对象添加一个名为 finish_at 的列.此日期时间将是 created_at 值加上 duration 的整数值。 Duration 是我们需要添加到 created_at 的小时数以获得 [=74 的值=].

结果应如下所示:

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

我该怎么做?

使用 Carbon (http://carbon.nesbot.com/docs/#api-addsub),可以为您完成类似的工作:

$log->finished_at = $log->created_at->addHours($log->statuses()->duration);

使用 Eloquent appends 可以解决这个问题。

添加附加属性并定义值。它看起来像下面这样。

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

第一步是将持续时间除以 24。 然后使用 using carbon 在 created_at 值中添加分割持续时间 喜欢这个

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