我正在执行 Doctrine 查询,结果包括查询实体的属性,但它不会“跟随”并获取相关实体的值。
例如我在 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_contrato
、pais
等)都存在,并且这些关系可用于过滤查询数据。
但是我的 $query->getQuery()->getArrayResult()
表达式的结果不包含这些关系中的数据。
它甚至不会包含该字段中的 id。例如,对于任何一条记录,它将仅包含以下字段:
- ID
- 替代
- 名字”
- nombreAlt
- 描述
- 波布拉西翁
- 空缺
- horarioIni
- horarioFin
- 网址
- 标签
- 克雷多
- caducidad
- 修改
- 消除
- 激活
这些都是有效字段,但不包括任何多对一关系的字段。
如何为该查询包含这些值,并且仅针对该查询?例如。不更改实体定义,因此所有查询都会受到影响?
最佳答案
只要看看: $query->select('o');
我想说(从 SQL 的角度考虑)这就是您所选择的。里面加点逗号吧我会尝试这样的事情:
$query->select('o', 'p', 'c');
我第一次尝试做的应该是一个数组。不像我展示的那样是逗号分隔的字符串。查看来源:
$selects = is_array($select) ? $select : func_get_args();
因此数组或参数列表都应该有效。
更新:
也许您只是缺少来自
?完全错过了。在这里我将分享一些我知道有效的代码。也许你会看到一些东西。很确定您只需要一个 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();
关于php - 在学说查询的结果中包含相关实体值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45805885/