Поле dateinterval
Поле dateinterval создаёт колонку для хранения интервалов
времени. В качестве значения используется объект DateInterval
из стандартной библиотеки PHP. Оно отлично подходит для хранения
таких величин, как продолжительность события, срок действия
подписки или задержка перед напоминанием.
Первым параметром в атрибут Column передаётся тип поля
'dateinterval'. Дополнительно можно указать параметры
nullable, options и другие.
Синтаксис
#[Column(type: 'dateinterval', nullable: nullable, options: options)]
Пример
Давайте создадим сущность Task с полем duration,
которое хранит продолжительность выполнения задачи:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
#[ORMEntity]
class Task
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private int $id;
#[ORMColumn(type: 'string', length: 255)]
private string $title;
#[ORMColumn(type: 'dateinterval')]
private DateInterval $duration;
public function getId(): int
{
return $this->id;
}
public function getTitle(): string
{
return $this->title;
}
public function setTitle(string $title): void
{
$this->title = $title;
}
public function getDuration(): DateInterval
{
return $this->duration;
}
public function setDuration(DateInterval $duration): void
{
$this->duration = $duration;
}
}
?>
Пример
Давайте сохраним задачу с интервалом в 2 часа 30 минут:
<?php
namespace AppController;
use AppEntityTask;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class TaskController extends AbstractController
{
#[Route('/task/create', name: 'task_create')]
public function create(EntityManagerInterface $em): Response
{
$task = new Task();
$task->setTitle('article');
$task->setDuration(new DateInterval('PT2H30M'));
$em->persist($task);
$em->flush();
return new Response('created');
}
}
?>
Результат выполнения кода:
"created"
Пример
Давайте прочитаем интервал из базы и выведем его в формате ISO 8601:
<?php
namespace AppController;
use AppEntityTask;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class TaskController extends AbstractController
{
#[Route('/task/show/{id}', name: 'task_show')]
public function show(int $id, EntityManagerInterface $em): Response
{
$task = $em->getRepository(Task::class)->find($id);
return new Response($task->getDuration()->format('%h hours %i minutes'));
}
}
?>
Результат выполнения кода для интервала PT2H30M:
"2 hours 30 minutes"