Параметр columnDefinition атрибута Column
Параметр columnDefinition атрибута Column
позволяет указать произвольное SQL-определение
для столбца таблицы. Он используется в тех случаях,
когда стандартных параметров Doctrine недостаточно:
например, для специфичных типов данных конкретной
СУБД, необычных ограничений или значений по умолчанию,
зависящих от диалекта базы данных. Значение параметра
представляет собой строку с фрагментом SQL-кода,
который будет подставлен в определение столбца при
создании таблицы.
Синтаксис
#[Column(type: 'string', columnDefinition: 'VARCHAR(255) NOT NULL DEFAULT \'abcde\'')]
Пример
Давайте создадим сущность Article с полем title,
для которого зададим произвольное SQL-определение:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
#[ORM\Table(name: 'articles')]
class Article
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private ?int $id = null;
#[ORM\Column(
type: 'string',
length: 255,
columnDefinition: 'VARCHAR(255) NOT NULL DEFAULT \'hello\''
)]
private string $title = 'hello';
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): string
{
return $this->title;
}
public function setTitle(string $title): self
{
$this->title = $title;
return $this;
}
}
?>
Теперь при генерации схемы Doctrine создаст столбец
title с указанным SQL-определением, включая
значение по умолчанию 'hello'.
Пример
Давайте используем columnDefinition для столбца
с типом datetime и автоматической установкой
текущего времени при вставке:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
#[ORM\Table(name: 'articles')]
class Article
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private ?int $id = null;
#[ORM\Column(
type: 'datetime',
columnDefinition: 'DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP'
)]
private \DateTimeInterface $createdAt;
public function __construct()
{
$this->createdAt = new \DateTime();
}
public function getId(): ?int
{
return $this->id;
}
public function getCreatedAt(): \DateTimeInterface
{
return $this->createdAt;
}
}
?>
При создании таблицы столбец created_at получит
значение по умолчанию на уровне базы данных -
текущую дату и время.
Пример
Давайте применим columnDefinition для хранения
JSON-данных в PostgreSQL с использованием типа jsonb:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
#[ORM\Table(name: 'articles')]
class Article
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private ?int $id = null;
#[ORM\Column(
type: 'json',
columnDefinition: 'JSONB NOT NULL DEFAULT \'{}\''
)]
private array $meta = [];
public function getId(): ?int
{
return $this->id;
}
public function getMeta(): array
{
return $this->meta;
}
public function setMeta(array $meta): self
{
$this->meta = $meta;
return $this;
}
}
?>
Такой подход позволяет задействовать нативный тип
jsonb PostgreSQL, который не поддерживается
стандартными средствами Doctrine DBAL.