#php #laravel
#php #laravel
Вопрос:
Я начинающий веб-разработчик.
Я делаю свой веб-сайт в Laravel 5.8.
Это моя модель и миграция:
class Timecycle extends Model
{
protected $fillable = [
'case_id',
'timecycleable_id',
'timecycleable_type',
'status',
'worked_time'
];
protected $casts = [
'id' => 'int',
'case_id' => 'int',
];
protected $dates = [
'created_at',
'updated_at'
];
public function stopwatch()
{
return $this->morphTo();
}
Schema::create('timecycles', function (Blueprint $table) {
$table->increments('id');
$table->integer('timecycleable_id');
$table->string('timecycleable_type');
$table->integer('case_id')->unsigned();
$table->foreign('case_id')->references('id')->on('case_instances')->onDelete('cascade');
$table->boolean('status')->default(0);
$table->integer('worked_time')->default(0);
$table->timestamps();
});
Контроллер:
public function sync()
{
$activeStopwatches = $this->getActiveStopwatches();
foreach ($activeStopwatches as $activeStopwatch) {
foreach ($activeStopwatch->timeCycle as $timeCycle) {
$newTime = now() - $timeCycle->updated_at;
$timeCycle->update(['worked_time' => $timeCycle->worked_time $newTime]);
}
}
}
public function getActiveStopwatches()
{
return $this->stopwatch::with(['timeCycle' => function ($q) {
$q->where('status', 1);
}, 'caseInstance'])
->where('user_id', Auth()->user()->id)
->whereHas('timeCycle', function ($q) {
$q->where('status', 1);
})
->get();
}
У меня есть метод, который отображает текущие секундомеры: getActiveStopwatches. Работает правильно. В функции sync () я хотел бы обновить worked_time. Итак: текущее время — дата последнего обновления, сохраните результат в worked_time.
Правильна ли эта запись для вычислений? Время, которое я хочу сохранить (переменная $ newTime), должно быть выражено в секундах.
Ответ №1:
@trzew Я надеюсь, что blow code поможет вам.
используйте Carbon Carbon;
$newTime = now() - $timeCycle->updated_at;
is not working fine , use time difference function to calculate difference
$mytime = CarbonCarbon::now();
$totalDuration = $newTime->diffInSeconds($timeCycle->updated_at);
gmdate('H:i:s', $totalDuration);
// 00:00:21
Ответ №2:
Вы не можете вычесть 2 даты таким образом, с помощью Carbon вы можете использовать этот ->diff()
метод. Это вернет объект DateInterval.
Чтобы получить разницу в секундах, вы можете использовать ->diffInSeconds()
метод.
$newTime = now()->diffInSeconds($timeCycle->updated_at);
Или вычесть временные метки :
now()->getTimestamp() - $timeCycle->updated_at->getTimestamp()