<?php
namespace App\Entity\Utils\Cloudinary;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Class Media.
*/
#[ORM\Table(name: 'cloudinary_media')]
#[ORM\Entity(repositoryClass: \App\Repository\Utils\Cloudinary\MediaRepository::class)]
class Media
{
final public const TYPE_SINGLE = 'single';
final public const TYPE_MULTIPLE = 'multiple';
/**
* Id.
*/
#[ORM\Id]
#[ORM\Column(type: \Doctrine\DBAL\Types\Types::INTEGER)]
#[ORM\GeneratedValue]
protected ?int $id = null;
/**
* @var \Doctrine\Common\Collections\Collection<\App\Entity\Utils\Cloudinary\MediaModel>
*/
#[Assert\Valid]
#[ORM\ManyToMany(targetEntity: \App\Entity\Utils\Cloudinary\MediaModel::class, inversedBy: 'entities', cascade: ['all'])]
#[ORM\JoinTable(name: 'cloudinary_media_collection', joinColumns: [new ORM\JoinColumn(name: 'entity_id', referencedColumnName: 'id')], inverseJoinColumns: [new ORM\JoinColumn(name: 'media_id', referencedColumnName: 'id')])]
protected \Doctrine\Common\Collections\Collection $medias;
#[Assert\Valid]
#[ORM\ManyToOne(targetEntity: \App\Entity\Utils\Cloudinary\MediaModel::class, inversedBy: 'singleEntities', cascade: ['all'])]
#[ORM\JoinColumn(name: 'media_id')]
protected ?MediaModel $singleMedia = null;
/**
* Media constructor.
*/
public function __construct()
{
$this->medias = new ArrayCollection();
$this->singleMedia = new MediaModel();
}
public function setId(int $id): void
{
$this->id = $id;
}
public function getId(): ?int
{
return $this->id;
}
public function getSingleMedia(): MediaModel
{
return $this->singleMedia;
}
public function setSingleMedia(?MediaModel $singleMedia = null): void
{
$this->singleMedia = $singleMedia;
}
public function addMedia(MediaModel $media): void
{
$this->medias[] = $media;
$media->addEntity($this);
}
public function removeMedia(MediaModel $media): void
{
$this->medias->removeElement($media);
$media->removeEntity($this);
}
public function getMedias(): ArrayCollection
{
return $this->medias;
}
public function getArrayData(): array
{
$data = [];
if ($this->singleMedia && ($this->singleMedia->getId() || $this->singleMedia->getPublicId())) {
$data['singleMedia'] = $this->singleMedia->getArrayData();
} elseif ($this->medias) {
$medias = [];
/** @var MediaModel $media */
foreach ($this->medias as $media) {
$medias[] = $media->getArrayData();
}
$data['medias'] = $medias;
}
return array_merge([
'id' => $this->id,
], $data);
}
public function setArrayData(array $data): void
{
if (array_key_exists('singleMedia', $data)) {
if (array_key_exists('id', $data['singleMedia'])) {
$media = $this->getSingleMedia();
} else {
$media = new MediaModel();
$this->setSingleMedia($media);
}
$media->setArrayData($data['singleMedia']);
} elseif (array_key_exists('medias', $data)) {
foreach ($data['medias'] as $dataImg) {
$media = new MediaModel();
$media->setArrayData($dataImg);
$this->addMedia($media);
}
}
}
}