在教义查询的结果中包含相关实体值

时间:2017-08-21 21:36:43

标签: php doctrine-orm

我正在进行一个Doctrine查询,结果包括查询实体的属性,但不是“跟随”并获取相关实体的值。

E.g。我在OfertaRepository

中有这个查询
$query = $this->createQueryBuilder('o');
$query->select('o');
$query->leftJoin(Pais::class, 'p', 'with', 'o.idPais = p.id');
$query->leftJoin( Contrato::class, 'c', 'with', 'o.idTipoContrato = c.id');
$query->andWhere('p.nombreCorto = :pais');
$query->andWhere('o.activa = 1');
$query->andWhere('o.eliminado is NULL');
$query->andWhere('o.caducidad > :hoy');
$query->setParameter('pais', $pais)->setParameter('hoy', new \DateTime());

return $query->getQuery()->getArrayResult();

实体Oferta具有:

/**
 * @var \Application\Entity\Pais
 *
 * @ORM\ManyToOne(targetEntity="Application\Entity\Pais")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="id_pais", referencedColumnName="id", nullable=true)
 * })
 */
private $idPais;


/**
 * @var \Application\Entity\TipoContrato
 *
 * @ORM\ManyToOne(targetEntity="Application\Entity\TipoContrato")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="id_tipo_contrato", referencedColumnName="id", nullable=true)
 * })
 */
private $idTipoContrato;

例如,所有引用的表(tipo_contratopais等)都存在,并且关系可用于过滤查询数据。

但是$query->getQuery()->getArrayResult()表达式的结果不包含这些关系中的数据。

它甚至不包含此字段中的ID。例如,对于任何一条记录,它只包括这些字段:

  • ID
  • ALT
  • NOMBRE“
  • nombreAlt
  • descripcion
  • poblacion
  • vacantes
  • horarioIni
  • horarioFin
  • url
  • 标签
  • creado
  • caducidad
  • modificado
  • eliminado
  • ACTIVA

哪些都是有效字段,但不包含任何多对一关系的字段。

如何为此查询包含这些值,仅针对此查询?例如。在不更改实体定义的情况下,所有查询会受到影响吗?

1 个答案:

答案 0 :(得分:2)

只看:$query->select('o');我会说(就SQL而言)是你所选择的。在那里得到一些逗号。我会尝试这样的事情:

$query->select('o', 'p', 'c');

我第一次尝试做的应该是一个数组。不是像我所示的逗号分隔的字符串。见来源:

$selects = is_array($select) ? $select : func_get_args();

因此,数组或参数列表都应该有用。

<强>更新

也许你只是错过了from?完全错过了。在这里,我将分享一些我知道可行的代码。也许你会看到一些东西。很确定你只需要一个from子句和select部分的多个obj引用。

$qb = $this->_em->createQueryBuilder();
        $qb->select('aimg', 'ai');
        $qb->from('OAS\Entity\AuctionImage', 'aimg');
        $qb->leftJoin('aimg.auctionItem', 'ai', \Doctrine\ORM\Query\Expr\Join::WITH, 'ai.lotNumber = aimg.lotNumber AND ai.auction = aimg.auction');
        $qb->where('aimg.auction = :auction')->setParameter('auction', $this->_auction);
        $qb->andWhere('aimg.isDeleted = :boolFalse')->setParameter('boolFalse', 0);
        $qb->andWhere('aimg.auctionItem IS NULL');
        $qb->orderBy('aimg.lotNumber', 'asc');
        $results = $qb->getQuery()->getResult();