symfony querybuilder 在其他实体中查找对象

symfony querybuilder find objects across other entity

我在 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;
    }
}

我需要从“carta”存储库中找到所有“clientes”,其“carta”具有“estado=1”。

到目前为止,我找到了所有具有“estado=1”的“cartas”

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

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

我知道有一种方法可以使用 join 或类似的方法,但坦率地说,我的知识很差......希望有人能帮助我。

如果需要更多代码,请随时询问。 BR...

尝试

$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()
;

也许我的问题表述不正确,但经过一些阅读后,我在下面分享正确的句子:

$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();

希望我的回答对以后的查询有所帮助