Параметр updatable атрибута Column
Параметр updatable атрибута Column управляет возможностью изменения значения колонки после того, как запись уже была создана. По умолчанию параметр имеет значение true, что разрешает обновление. Если установить false, то Doctrine запретит изменять значение этой колонки через UPDATE-запросы. Параметр принимает булево значение.
Синтаксис
#[Column(type: 'string', updatable: false)]
Пример
Давайте создадим сущность с полем createdAt, которое нельзя обновить после создания записи:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
class Article
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private int $id;
#[ORM\Column(type: 'string', length: 255)]
private string $title;
#[ORM\Column(type: 'datetime', updatable: 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;
}
}
?>
Теперь попробуем изменить значение поля createdAt после сохранения записи:
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_create')]
public function create(EntityManagerInterface $em): Response
{
$article = new Article();
$article->setTitle('hello');
$article->setCreatedAt(new \DateTime());
$em->persist($article);
$em->flush();
$article->setCreatedAt(new \DateTime('2025-01-01'));
$em->flush();
return new Response('done');
}
}
?>
Результат выполнения кода:
done
Второй вызов flush не обновит колонку createdAt в базе данных, потому что параметр updatable установлен в false. Значение поля в объекте изменится, но SQL-запрос UPDATE не будет содержать эту колонку.
Пример
Давайте создадим сущность с полем updatedAt, которое, наоборот, разрешено обновлять:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
class Article
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private int $id;
#[ORM\Column(type: 'string', length: 255)]
private string $title;
#[ORM\Column(type: 'datetime', updatable: true)]
private \DateTimeInterface $updatedAt;
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 setUpdatedAt(\DateTimeInterface $updatedAt): self
{
$this->updatedAt = $updatedAt;
return $this;
}
public function getUpdatedAt(): \DateTimeInterface
{
return $this->updatedAt;
}
}
?>
Теперь изменим значение поля updatedAt после сохранения записи:
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/update', name: 'article_update')]
public function update(EntityManagerInterface $em): Response
{
$article = new Article();
$article->setTitle('hello');
$article->setUpdatedAt(new \DateTime());
$em->persist($article);
$em->flush();
$article->setUpdatedAt(new \DateTime('2025-01-01'));
$em->flush();
return new Response('done');
}
}
?>
Результат выполнения кода:
done
В этом случае второй вызов flush обновит колонку updatedAt в базе данных, так как параметр updatable равен true.
Смотрите также
-
атрибут
Column,
который задаёт параметры колонки в базе данных -
параметр
insertable,
который запрещает вставку значения колонки -
параметр
nullable,
который разрешает NULL в колонке -
параметр
unique,
который делает значения колонки уникальными