Symfony2 Understading doctrine查询Join

时间:2015-07-29 12:45:32

标签: php mysql symfony doctrine-orm doctrine

因此,通过使用普通原则来理解查询没有问题,例如:

        $carousel = $em->getRepository('ApplicationSonataMediaBundle:Gallery')->findOneBy(array('name' => 'Carousel'));
        $featureProducts = $em->getRepository('MpShopBundle:Product')->findBy(array('status' => 1, 'special' => 1));
        $newProducts = $em->getRepository('MpShopBundle:Product')->findBy(array('status' => 1), array('id' => 'ASC'), 8);

然而,我来到了我的项目的一部分,我有很多疑问(在我的情况下是71)。我需要使用Join来完成它们。但我只是无法理解它的一些部分......

我正在使用此文档:http://symfony.com/doc/current/book/doctrine.html#joining-related-records

这是查询:

$query = $this->getEntityManager()
    ->createQuery(
        'SELECT p, c FROM AppBundle:Product p
        JOIN p.category c
        WHERE p.id = :id'
    )->setParameter('id', $id);

有人可以解释这是如何运作的。我不明白字母p,c是什么意思。 JOIN正在发生什么事情。我对sql查询的经验不多,因为现在我只需要symfony2学说......我认为这不仅有助于我,还有其他人可以理解。谢谢!

1 个答案:

答案 0 :(得分:3)

您的加入查询将返回ProductCategory两个实体的结果,结果集将返回产品ID与:id提供的参数及其相关类别匹配的产品行,现在位于select中的dql p, c是实体的别名 p 是指Product实体, c 是指您的实体category实体,如果您的查询中有另一个联接,例如JOIN p.manufactures m,那么如果您还需要产品制造商,则dql select将类似于SELECT p, c, m..

现在,作为doctrine将数据库表映射到实体,因此dql中的连接部分不涉及on()子句,因为它从属性上定义的annotations读取on()部分在您的实体中,您的Product实体应该具有类别关联的映射,例如

/**
 * @ORM\OneToMany(targetEntity="Category", mappedBy="product")
 */
protected $category;

并且您的类别实体将指向产品某些内容,例如

/**
 * @ORM\ManyToOne(targetEntity="Product", inversedBy="category")
 * @ORM\JoinColumn(name="product_id", referencedColumnName="id")
 */
protected $product;

有关详细信息,请参阅文档Databases and Doctrine