Home > Back-end >  symfony querybuilder find objects across other entity
symfony querybuilder find objects across other entity

Time:05-05

I have the following entity in symfony:

<?php

namespace App\Entity;

use App\Repository\CartaRepository;
use DateInterval;
use DateTime;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass=CartaRepository::class)
 * @ORM\Table(name="sac_sala_cartas")
 */
class Carta
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity=Cliente::class, inversedBy="cartas")
     * @ORM\JoinColumn(nullable=false)
     */
    private $cliente;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $documento;

    /**
     * @ORM\Column(type="smallint")
     */
    private $estado;

    /**
     * @ORM\Column(type="text", nullable=true)
     */
    private $observaciones;

    /**
     * @ORM\Column(type="date")
     */
    private $fecha_solicitud;

    /**
     * @ORM\Column(type="date")
     */
    private $fecha_respuesta;

    /**
     * @ORM\Column(type="date")
     */
    private $fecha_vencimiento;

    /**
     * @ORM\ManyToMany(targetEntity=Fondo::class, inversedBy="cartas")
     * @ORM\JoinTable(name="sac_sala_cartas_fondos")
     */
    private $fondos;

    public function __construct()
    {
        $this->fondos = new ArrayCollection();
        $this->estado = 0;
        $this->fecha_solicitud = new DateTime('now');
        $this->fecha_respuesta = DATE_ADD(new DateTime('now'), DateInterval::createFromDateString('3 day'));
        $this->fecha_vencimiento = DATE_ADD(new DateTime('now'), DateInterval::createFromDateString('1 year'));
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getCliente(): ?Cliente
    {
        return $this->cliente;
    }

    public function setCliente(?Cliente $cliente): self
    {
        $this->cliente = $cliente;

        return $this;
    }

    public function getDocumento(): ?string
    {
        return $this->documento;
    }

    public function setDocumento(string $documento): self
    {
        $this->documento = $documento;

        return $this;
    }

    public function getEstado(): ?int
    {
        return $this->estado;
    }

    public function setEstado(int $estado): self
    {
        $this->estado = $estado;

        return $this;
    }

    public function getObservaciones(): ?string
    {
        return $this->observaciones;
    }

    public function setObservaciones(string $observaciones): self
    {
        $this->observaciones = $observaciones;

        return $this;
    }

    public function getFechaSolicitud(): ?\DateTimeInterface
    {
        return $this->fecha_solicitud;
    }

    public function setFechaSolicitud(\DateTimeInterface $fecha_solicitud): self
    {
        $this->fecha_solicitud = $fecha_solicitud;

        return $this;
    }

    public function getFechaRespuesta(): ?\DateTimeInterface
    {
        return $this->fecha_respuesta;
    }

    public function setFechaRespuesta(\DateTimeInterface $fecha_respuesta): self
    {
        $this->fecha_respuesta = $fecha_respuesta;

        return $this;
    }

    public function getFechaVencimiento(): ?\DateTimeInterface
    {
        return $this->fecha_vencimiento;
    }

    public function setFechaVencimiento(\DateTimeInterface $fecha_vencimiento): self
    {
        $this->fecha_vencimiento = $fecha_vencimiento;

        return $this;
    }

    /**
     * @return Collection<int, Fondo>
     */
    public function getFondos(): Collection
    {
        return $this->fondos;
    }

    public function addFondo(Fondo $fondo): self
    {
        if (!$this->fondos->contains($fondo)) {
            $this->fondos[] = $fondo;
        }

        return $this;
    }

    public function removeFondo(Fondo $fondo): self
    {
        $this->fondos->removeElement($fondo);

        return $this;
    }
}

and I need to find all "clientes" from the "carta" repository whose "carta" have "estado=1".

So far I find all "cartas" that have "estado=1"

$cartas = $this->em->getRepository(Carta::class);

$cartasAutorizadas = $cartas->createQueryBuilder("c")
       ->where("c.estado = :carta_estado")
       ->setParameter("carta_estado", 1)
       ->getQuery()
       ->getResult()
;

and I know that there is a way using join or something like that but frankly my knowledge is very poor... hope somebody can help me.

If more code is needed please do not hesitate to ask. BR...

CodePudding user response:

Try

$cartas = $this->em->getRepository(Carta::class);

$cartasAutorizadas = $cartas->createQueryBuilder('c')
       ->select('cl')
       ->innerJoin('c.cliente', 'cl')
       ->where('c.estado = :carta_estado')
       ->setParameter('carta_estado', 1)
       ->distinct()
       ->getQuery()
       ->getResult()
;

CodePudding user response:

Perhaps my question was not formulated correctly, but after some reading I share the correct sentence below:

$clientes = $this->em->getRepository(Cliente::class);

$clientesAuth = $clientes->createQueryBuilder('cliente')
        ->leftJoin('cliente.cartas', 'c')
        ->where('c.estado = :carta_estado')
        ->setParameter("carta_estado", 1)
        ->getQuery()
        ->getResult();

I hope my answer will help future queries

  • Related