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();
希望我的回答对以后的查询有所帮助
我在 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();
希望我的回答对以后的查询有所帮助