Doctrine get item with item

时间:2015-05-27 18:18:42

标签: php symfony doctrine-orm

我想获得与另一个实体相关联的实体的字段。

我的实体商品有一个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元素。

或者返回实体商品而不是在数组中。

1 个答案:

答案 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';

但要小心,这仍然可能会返回多行。