3
respostas

Como gerar a data automática na nossa Entity

Se tivéssemos um campo do tipo date time como geraríamos a data automática para ele? De forma que o nosso banco entendesse.

3 respostas

Achei a solução. Passando para o nosso construtor o \DateTime("now") o framework faz essa associação e insere o datetime bonitinho pra gente. Só que para a hora ficar certinha temos que recorer a outro recurso do datetime;

Vou deixar um link de referência: https://www.doctrine-project.org/projects/doctrine-orm/en/2.13/cookbook/working-with-datetime.html

<?php

declare(strict_types=1);

namespace Src\Entity;

//use Doctrine\Common\Collections\ArrayCollection;
//use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;
use Doctrine\ORM\Mapping\GeneratedValue;
use Doctrine\ORM\Mapping\Id;
//use Doctrine\ORM\Mapping\ManyToMany;
//use Doctrine\ORM\Mapping\OneToMany;

#[Entity(repositoryClass: DoctrineUsersRepository::class)]
#[Table('users')]

class Users
{
    #[Id] 
    #[Column, GeneratedValue]
    private int $id;

    #[Column(name: 'created_at')]
    private \DateTime $createdAt;

    public function __construct
    (
        #[Column(length: 100)]
        public readonly string $name,
        #[Column(length: 100)]
        public readonly string $email,
        #[Column(length: 15)]
        public readonly string $cpf,
        #[Column]
        public readonly string $password
    ) {
        $this->CreatedAt();

    }

    /**
     * Set the value of createdAt
     */
    public function CreatedAt()
    {
        $this->createdAt = new \DateTime("now");
        return $this->createdAt;
    }

}

Atenção a ordem do código determina a ordem da tabela. Definindo CreateAt após o construct, nosso banco de dados colocará a data no como última coluna.

<?php

declare(strict_types=1);

namespace Src\Entity;

//use Doctrine\Common\Collections\ArrayCollection;
//use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;
use Doctrine\ORM\Mapping\GeneratedValue;
use Doctrine\ORM\Mapping\Id;
//use Doctrine\ORM\Mapping\ManyToMany;
//use Doctrine\ORM\Mapping\OneToMany;

#[Entity(repositoryClass: DoctrineUsersRepository::class)]
#[Table('users')]

class Users
{
    #[Id] 
    #[Column, GeneratedValue]
    private int $id;

    public function __construct
    (
        #[Column(length: 100)]
        public readonly string $name,
        #[Column(length: 100)]
        public readonly string $email,
        #[Column(length: 15)]
        public readonly string $cpf,
        #[Column]
        public readonly string $password
    ) {
        $this->CreatedAt();
    }

    #[Column(name: 'created_at')]
    private \DateTime $createdAt;

    /**
     * Set the value of createdAt
     */
    public function CreatedAt()
    {
        $this->createdAt = new \DateTime("now");
        return $this->createdAt;
    }

}

Olá, Philipe. Tudo bem?

Gostaria de pedir desculpas pela demora em responder o seu tópico.

Que bom que você conseguiu achar a solução para a sua problemática, e foi uma solução bem plausível. Parabéns!

Só deixar um comentário, você também poderia passar o formato dessa data, da seguinte maneira:

$data = new \DateTime("now");
var_dump($data->format("Y-m-d H:i:s"));

Isso pode ser útil, em algumas situações!

Bons estudos :)