我想获得与另一个实体相关联的实体的字段。
我的实体商品有一个last_offer字段。 优惠与产品实体有关。
然后,通过我的实体产品咨询,我想获得与实体优惠相关的最新优惠。
控制器:
public function lastAction($key)
{
$em = $this->getDoctrine()->getManager();
$last_offer = $em->getRepository('MyAppBundle:Products')->findOfferByKey($key);
$response = new JsonResponse();
return $response->setData($last_offer);
}
我的存储库:
public function findOfferByKey($key){
$em = $this->getEntityManager();
$dql = 'SELECT pr, of FROM MyAppBundle\AppBundle\Entity\Products pr
INNER JOIN pr.offers of
WHERE pr.key = :key';
$query = $this->getEntityManager()
->createQuery($dql)
->setParameter('key', $key)
->setHydrationMode(\Doctrine\ORM\Query::HYDRATE_ARRAY);
return $query->execute();
}
我的路线:
last_offer:
path: /{key}/last_offer
defaults: { _controller: "MyAppBundle:Products:last" }
但是,这会返回一个数组。
我想只返回last_offer元素。
或者返回实体商品而不是在数组中。
答案 0 :(得分:0)
你特别告诉学说用这一行生成/返回一个数组
->setHydrationMode(\Doctrine\ORM\Query::HYDRATE_ARRAY);
我认为您需要做的就是删除该行,而doctrine将生成/返回实体。 然而,您将获得Collection,因此请务必考虑到这一点。也许像是
public function findOfferByKey($key) {
$dql = 'SELECT pr, of FROM MyAppBundle\AppBundle\Entity\Products pr
INNER JOIN pr.offers of
WHERE pr.key = :key';
$query = $this->getEntityManager()
->createQuery($dql)
->setParameter('key', $key)
;
$results = $query->execute();
if (count($results) !== 1)
{
// It's up to you how to handle zero or multiple rows
}
return $results->current();
}
我看到发生了什么 - 我没注意你的SELECT
caluse。您不是仅选择last_offer
列,而是选择整个产品 和 优惠实体= $results
将会是所有这些在一起的数组。在这种情况下,$query->execute()
将返回array()
而不是集合。
如果您只想选择Offer
个实体,则需要修改SELECT
$dql = 'SELECT of
FROM MyAppBundle\AppBundle\Entity\Products pr
INNER JOIN pr.offers of
WHERE pr.key = :key';
但要小心,这仍然可能会返回多行。