Параметр insertable атрибута Column
Параметр insertable атрибута Column
управляет тем, будет ли колонка участвовать
в SQL-запросе вставки новой записи. По умолчанию
параметр равен true, и значение поля
попадает в запрос INSERT. Если установить
false, Doctrine исключит эту колонку
из запроса вставки, а значение будет
проигнорировано при сохранении новой сущности.
Это удобно для полей, которые заполняются
триггерами базы данных или вычисляются
на стороне СУБД.
Синтаксис
#[Column(type: type, insertable: false)]
Пример
Давайте объявим сущность с полем createdAt,
значение которого выставляет триггер базы данных.
Поле помечено insertable: false:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
#[ORMEntity]
#[ORMTable(name: 'articles')]
class Article
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private ?int $id = null;
#[ORMColumn(type: 'string', length: 255)]
private string $title;
#[ORMColumn(type: 'datetime', insertable: false)]
private DateTimeInterface $createdAt;
public function getId(): ?int
{
return $this->id;
}
public function setTitle(string $title): self
{
$this->title = $title;
return $this;
}
public function getTitle(): string
{
return $this->title;
}
public function setCreatedAt(DateTimeInterface $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
public function getCreatedAt(): DateTimeInterface
{
return $this->createdAt;
}
}
?>
Теперь при сохранении новой сущности колонка
created_at не попадёт в запрос INSERT,
и значение выставит сама база данных.
Пример
Давайте сохраним новую сущность и проверим, какие данные попадут в базу:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function create(EntityManagerInterface $em): Response
{
$article = new Article();
$article->setTitle('abcde');
$article->setCreatedAt(new DateTime());
$em->persist($article);
$em->flush();
return new Response((string) $article->getId());
}
}
?>
Результат выполнения SQL-запроса:
"INSERT INTO articles (title) VALUES ('abcde')"
Как видно, колонка created_at отсутствует
в запросе, потому что для неё установлено
insertable: false. Значение поля
createdAt будет заполнено при чтении
сущности из базы данных.