LobsterJoe
@LobsterJoe

Как проверить, изменилось ли поле в сущности?

Ситуация следующая: есть некая сущность, например, Статья, с полями &created, &updated. &updated обновляется всякий раз, когда я сделаю flush() (с помощью PrePersist(), PreFlush()).
Я хочу добавить в сущность ещё одно поле, например, $modified, которое хранило бы дату изменения контента. Условно, при сохранении сущности я бы хотел проверять, изменилось ли содержимое статьи ($content), и если да, то записать дату в $modified.

Подскажите, куда копать в поиске правильного с архитектурной точки зрения решения.
  • Вопрос задан
  • 386 просмотров
Решения вопроса 1
@bears
Событие preUpdate как раз таки сработает, если в сущности изменено хоть одно поле, не важно какое. Но если хотите узнать, изменилось ли конкретное поле, тогда в том же событии preUpdate можно сделать так:
$unitOfWork = $entityManager->getUnitOfWork();
$unitOfWork->computeChangeSets();

$changesets = $unitOfWork->getEntityChangeSet($article);

$changesets это ассоциативный массив, где ключ - имя поля, а значение массив с двумя элементами:
0 - до, 1 - после изменения.
Другими словами, факт существования ключа $changesets['content'] говорит о том, что это поле было изменено.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
DarkRaven
@DarkRaven
разработка программного обеспечения
В целом, выше ответили. От себя хочу добавить свой кусок кода, который у меня используется:

namespace AppBundle\Entity;

use DateTime;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\HasLifecycleCallbacks
 */
abstract class EntityBase
{

    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var DateTime
     *
     * @ORM\Column(name="created_at", type="datetime")
     */
    protected $createdAt;

    /**
     * @var DateTime
     * @ORM\Column(name="updated_at", type="datetime")
     */
    protected $updatedAt;

    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * 
     * @return \DateTime
     */
    public function getCreatedAt()
    {
        return $this->createdAt;
    }

    /**
     * 
     * @return \DateTime
     */
    public function getUpdatedAt()
    {
        return $this->updatedAt;
    }

    public function setId($id)
    {
        $this->id = $id;
    }

    public function setCreatedAt($createdAt)
    {
        $this->createdAt = $createdAt;
    }

    public function setUpdatedAt($updatedAt)
    {
        $this->updatedAt = $updatedAt;
    }

    /**
     *
     * @ORM\PrePersist
     * @ORM\PreUpdate
     */
    public function updatedTimestamps()
    {
        $this->setUpdatedAt(new DateTime('now'));

        if ($this->getCreatedAt() == null) {
            $this->setCreatedAt(new DateTime('now'));
        }
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы