因此,通过使用普通原则来理解查询没有问题,例如:
$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学说......我认为这不仅有助于我,还有其他人可以理解。谢谢!
答案 0 :(得分:3)
您的加入查询将返回Product
和Category
两个实体的结果,结果集将返回产品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