103 lines
2.5 KiB
PHP
103 lines
2.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Entity;
|
|
|
|
use App\Enum\OrderStatus;
|
|
use App\Repository\OrderRepository;
|
|
use DateTimeImmutable;
|
|
use Doctrine\Common\Collections\ArrayCollection;
|
|
use Doctrine\Common\Collections\Collection;
|
|
use Doctrine\ORM\Mapping as ORM;
|
|
|
|
#[ORM\Entity(repositoryClass: OrderRepository::class)]
|
|
#[ORM\Table(name: '`order`')] // 'order' is a reserved keyword in SQL, so we escape it
|
|
class Order
|
|
{
|
|
#[ORM\Id]
|
|
#[ORM\GeneratedValue]
|
|
#[ORM\Column(type: 'integer')]
|
|
private null|int $id = null;
|
|
|
|
#[ORM\Column(type: 'datetime_immutable')]
|
|
private readonly DateTimeImmutable $createdAt;
|
|
|
|
#[ORM\Column(type: 'datetime_immutable')]
|
|
private DateTimeImmutable $updatedAt;
|
|
|
|
#[ORM\OneToMany(mappedBy: 'order', targetEntity: OrderItem::class, cascade: ['persist', 'remove'])]
|
|
private Collection $orderItems;
|
|
|
|
#[ORM\Column(nullable: false, enumType: OrderStatus::class, options: [
|
|
'default' => OrderStatus::NEW,
|
|
])]
|
|
private OrderStatus $status = OrderStatus::NEW;
|
|
|
|
public function __construct(
|
|
) {
|
|
$this->createdAt = new DateTimeImmutable();
|
|
$this->updatedAt = new DateTimeImmutable();
|
|
$this->orderItems = new ArrayCollection();
|
|
}
|
|
|
|
public function getId(): null|int
|
|
{
|
|
return $this->id;
|
|
}
|
|
|
|
public function getStatus(): OrderStatus
|
|
{
|
|
return $this->status;
|
|
}
|
|
|
|
public function setStatus(OrderStatus $status): self
|
|
{
|
|
$this->status = $status;
|
|
$this->updateTimestamp();
|
|
return $this;
|
|
}
|
|
|
|
public function getCreatedAt(): DateTimeImmutable
|
|
{
|
|
return $this->createdAt;
|
|
}
|
|
|
|
public function getUpdatedAt(): DateTimeImmutable
|
|
{
|
|
return $this->updatedAt;
|
|
}
|
|
|
|
/**
|
|
* @return Collection<int, OrderItem>
|
|
*/
|
|
public function getOrderItems(): Collection
|
|
{
|
|
return $this->orderItems;
|
|
}
|
|
|
|
public function addOrderItem(OrderItem $orderItem): self
|
|
{
|
|
if (!$this->orderItems->contains($orderItem)) {
|
|
$this->orderItems[] = $orderItem;
|
|
$orderItem->setOrder($this);
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function removeOrderItem(OrderItem $orderItem): self
|
|
{
|
|
// set the owning side to null (unless already changed)
|
|
if ($this->orderItems->removeElement($orderItem) && $orderItem->getOrder() === $this) {
|
|
$orderItem->setOrder(null);
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
private function updateTimestamp(): void
|
|
{
|
|
$this->updatedAt = new DateTimeImmutable();
|
|
}
|
|
}
|