Transforming SQL into Doctrine Query
I have this raw SQL query that I have a hard time transforming to a Doctrine Query.
My goal is to get The Influencer that have applied to The offer.
I have a ManyToMany
relationship between the entities Application and Influencer
.
SELECT * FROM application
LEFT JOIN application_influencer
ON application_influencer.application_id = application.id
APPLICATION ENTITY
<?php
namespace App\Entity;
use App\Repository\ApplicationRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass=ApplicationRepository::class)
*/
class Application
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToMany(targetEntity=Influencer::class, inversedBy="applications")
*/
private $influencerId;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $status;
/**
* @ORM\ManyToOne(targetEntity=Offer::class, inversedBy="application")
* @ORM\JoinColumn(nullable=false)
*/
private $offer;
public function __construct()
{
$this->influencerId = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
/**
* @return Collection|Influencer[]
*/
public function getInfluencerId(): Collection
{
return $this->influencerId;
}
public function addInfluencerId(Influencer $influencerId): self
{
if (!$this->influencerId->contains($influencerId)) {
$this->influencerId[] = $influencerId;
}
return $this;
}
public function removeInfluencerId(Influencer $influencerId): self
{
$this->influencerId->removeElement($influencerId);
return $this;
}
public function getStatus(): ?string
{
return $this->status;
}
public function setStatus(?string $status): self
{
$this->status = $status;
return $this;
}
public function getOffer(): ?Offer
{
return $this->offer;
}
public function setOffer(?Offer $offer): self
{
$this->offer = $offer;
return $this;
}
}
INFLUENCER ENTITY
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use App\Repository\InfluencerRepository;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\HttpFoundation\File\File;
use Vich\UploaderBundle\Mapping\Annotation as Vich;
/**
* @ORM\Entity(repositoryClass=InfluencerRepository::class)
* @UniqueEntity("username", message="Ce pseudo est déjà utilisé")
* @Vich\Uploadable
*/
class Influencer
{
const SERVER_PATH_TO_IMAGE_FOLDER = '/public/uploads';
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="array", nullable=true)
*/
private $socialNetwork = [
'Website' => '',
'Instagram' => '',
'Tiktok' => '',
'Facebook' => '',
'Youtube' => '',
'Twitter' => '',
'Twitch' => ''
];
/**
* @ORM\Column(type="integer", nullable=true)
* @Assert\Type(
* type="integer",
* message="Vous ne pouvez pas mettre de lettre, mettez des chiffres"
* )
*/
private $siret;
/**
* @ORM\ManyToMany(targetEntity=Application::class, mappedBy="influencerId")
*/
private $applications;
/**
* @ORM\OneToMany(targetEntity=Contract::class, mappedBy="influencerId")
*/
private $brandId;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Assert\Regex("/^[a-z0-9]+$/i", message="Vous ne pouvez pas mettre d'espace")
*/
private $username;
/**
* @ORM\Column(type="json", nullable=true)
*/
private $type = [];
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $description;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $profilePhoto;
/**
* @Vich\UploadableField(mapping="cover_image_user", fileNameProperty="profilePhoto")
* @var File
*/
private $imageFile;
/**
* @ORM\Column(type="datetime", nullable=true)
* @var \DateTime
*/
private $updatedAt;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $name;
/**
* @ORM\ManyToOne(targetEntity=User::class, inversedBy="influencer")
* @ORM\JoinColumn(nullable=false)
*/
private $UserId;
public function __construct()
{
$this->applications = new ArrayCollection();
$this->brandId = new ArrayCollection();
}
/**
* toString
* @return string
*/
/* public function __toString()
{
if(is_null($this->applications)){
return 'NULL';
}
return $this->applications;
}*/
public function getId(): ?int
{
return $this->id;
}
public function getSocialNetwork(): ?array
{
return $this->socialNetwork;
}
public function setSocialNetwork(array $socialNetwork): self
{
$this->socialNetwork = $socialNetwork;
return $this;
}
public function getSiret(): ?int
{
return $this->siret;
}
public function setSiret(?int $siret): self
{
$this->siret = $siret;
return $this;
}
/**
* @return Collection|Application[]
*/
public function getApplications(): Collection
{
return $this->applications;
}
public function addApplication(Application $application): self
{
if (!$this->applications->contains($application)) {
$this->applications[] = $application;
$application->addInfluencerId($this);
}
return $this;
}
public function removeApplication(Application $application): self
{
if ($this->applications->removeElement($application)) {
$application->removeInfluencerId($this);
}
return $this;
}
/**
* @return Collection|Contract[]
*/
public function getBrandId(): Collection
{
return $this->brandId;
}
public function addBrandId(Contract $brandId): self
{
if (!$this->brandId->contains($brandId)) {
$this->brandId[] = $brandId;
$brandId->setInfluencerId($this);
}
return $this;
}
public function removeBrandId(Contract $brandId): self
{
if ($this->brandId->removeElement($brandId)) {
// set the owning side to null (unless already changed)
if ($brandId->getInfluencerId() === $this) {
$brandId->setInfluencerId(null);
}
}
return $this;
}
public function getUsername(): ?string
{
return $this->username;
}
public function setUsername(?string $username): self
{
$this->username = $username;
return $this;
}
public function getType(): ?array
{
return $this->type;
}
public function setType(?array $type): self
{
$this->type = $type;
return $this;
}
public function getDescription(): ?string
{
return $this->description;
}
public function setDescription(?string $description): self
{
$this->description = $description;
return $this;
}
public function getProfilePhoto(): ?string
{
return $this->profilePhoto;
}
public function setProfilePhoto(?string $profilePhoto): self
{
$this->profilePhoto = $profilePhoto;
return $this;
}
/**
* @param null|File $imageFile
* @return User
* @throws Exception
*/
public function setImageFile(File $image = null)
{
$this->imageFile = $image;
// permet a vich de savoir si l'image est nouvelle ou pas.
if ($image) {
$this->updatedAt = new \DateTime('now');
}
}
public function getImageFile()
{
return $this->imageFile;
}
public function getUpdatedAt(): ?\DateTimeInterface
{
return $this->updatedAt;
}
public function setUpdatedAt(\DateTimeInterface $updatedAt): self
{
$this->updatedAt = $updatedAt;
return $this;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(?string $name): self
{
$this->name = $name;
return $this;
}
public function getUserId(): ?User
{
return $this->UserId;
}
public function setUserId(?User $UserId): self
{
$this->UserId = $UserId;
return $this;
}
}
OFFER ENTITY
<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use App\Repository\OfferRepository;
use Doctrine\ORM\Mapping\JoinColumn;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass=OfferRepository::class)
* @ORM\HasLifecycleCallbacks()
*/
class Offer
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
* @Assert\NotBlank
*/
private $name;
/**
* @ORM\Column(type="text", length=65535)
* @Assert\NotBlank
*/
private $description;
/**
* @ORM\Column(type="datetimetz")
*/
private $dateCreation;
/**
* @ORM\Column(type="datetimetz")
*@Assert\GreaterThanOrEqual("tomorrow", message="Une offre peut commencer qu'à partir de demain.")
*@Assert\GreaterThan(propertyPath="dateCreation", message="Une offre ne peut pas être inférieure à la date de publication.")
*@Assert\LessThanOrEqual(propertyPath="dateEnd", message="La date de commencement doit être inférieure à la date de fin.")
*/
private $dateStart;
/**
* @ORM\Column(type="datetimetz")
*@Assert\GreaterThanOrEqual("tomorrow")
*@Assert\GreaterThanOrEqual(propertyPath="dateStart", message="La date de fin doit être supérieure à la date de commencement.")
* @Assert\Range(
* minPropertyPath = "dateStart",
* max = "+5 years"
* )
*/
private $dateEnd;
/**
* @ORM\Column(type="json")
*/
private $field = [];
/**
* @ORM\ManyToOne(targetEntity=Brand::class, inversedBy="offers")
* @ORM\JoinColumn(nullable=false)
*/
private $brandId;
/**
* @ORM\OneToMany(targetEntity=Application::class, mappedBy="offer", orphanRemoval=true)
*/
private $application;
public function __construct()
{
$this->application = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getDescription(): ?string
{
return $this->description;
}
public function setDescription(string $description): self
{
$this->description = $description;
return $this;
}
public function getDateCreation(): ?\DateTimeInterface
{
return $this->dateCreation;
}
/**
* Gets triggered only on insert
* @ORM\PrePersist
*/
public function setDateCreation(): void
{
$this->dateCreation = new \DateTime("now");
}
public function getDateStart(): ?\DateTimeInterface
{
return $this->dateStart;
}
public function setDateStart(\DateTimeInterface $dateStart): self
{
$this->dateStart = $dateStart;
return $this;
}
public function getDateEnd(): ?\DateTimeInterface
{
return $this->dateEnd;
}
public function setDateEnd(\DateTimeInterface $dateEnd): self
{
$this->dateEnd = $dateEnd;
return $this;
}
public function getField(): ?array
{
return $this->field;
}
public function setField(array $field): self
{
$this->field = $field;
return $this;
}
public function getBrandId(): ?Brand
{
return $this->brandId;
}
public function setBrandId(?Brand $brandId): self
{
$this->brandId = $brandId;
return $this;
}
/**
* @return Collection|Application[]
*/
public function getApplication(): Collection
{
return $this->application;
}
public function addApplication(Application $application): self
{
if (!$this->application->contains($application)) {
$this->application[] = $application;
$application->setOffer($this);
}
return $this;
}
public function removeApplication(Application $application): self
{
if ($this->application->removeElement($application)) {
// set the owning side to null (unless already changed)
if ($application->getOffer() === $this) {
$application->setOffer(null);
}
}
return $this;
}
}