2011-10-28 34 views
1

我有实体Product和实体Subcategory如何根据Doctrine2中另一个Entitiy中的字段值获取实体?

Subcategory.php

namespace Project\Entities;  

/** 
* Subcategory 
* @Entity 
* @Table(name="subcategories") 
* 
*/ 
class Subcategory { 
/** 
* 
* @Id 
* @GeneratedValue 
* @Column(type="integer") 
* @var integer $id 
*/ 
public $id; 

/** 
* @Column(type="string") 
* @var string $name 
*/ 
public $name; 
} 

Product.php

namespace Project\Entities; 

/** 
* 
* Product 
* @Entity 
* @Table(name="products") 
*/ 
class Product { 
    /** 
    * 
    * @Id 
    * @GeneratedValue 
    * @Column(type="integer",length=16) 
    * @var integer $id 
    */ 
    public $id; 

    /** 
    * 
    * @Column(type="integer",length=3) 
    * @var integer $id_subcat 
    */ 
    public $id_subcat; 

    /** 
    * 
    * @Column(type="string") 
    * @var integer $name 
    */ 
    public $name; 


    /** 
    * 
    * @Column(type="string") 
    * @var integer $available 
    */ 
    public $available; 
} 

我想获得的所有SubcategoriesProductsavailable场等于1. Ergo。获取仅包含可用产品的子类别。

我知道如何写SQL查询,但我不知道如何实现这个在DQL

我应该提供一些额外的注释吗?

回答

3

你必须声明你的实体之间的关系开始。我会假设你的子类别可以有很多产品(一对多):

我还没有测试过这个代码,所以我很抱歉,如果有一些错误,这是我的头顶大多。

/** 
* Subcategory 
* @Entity 
* @Table(name="subcategories") 
* 
*/ 
class Subcategory { 
    /** 
    * @OneToMany(targetEntity="Project\Entities\Product", mappedBy="id_subcat") 
    * @var Products[] 
    */ 
    protected $products; 

    public function __construct() 
    { 
      $this->products = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

    // Leaving out rest of class for simplicity... 
} 


/** 
* 
* Product 
* @Entity 
* @Table(name="products") 
*/ 
class Product { 

    // Rest of class.... 

    /** 
    * @ManyToOne(targetEntity="Project\Entities\Subcategory", inversedBy="products") 
    * @JoinColumn(name="id_subcat", referencedColumnName="id") 
    */ 
    protected $id_subcat = null; 

} 

**然后进行查询,在SF2,这将是这样的:

/* var \Doctrine\ORM\EntityManager $em */ 
$dql = "SELECT p FROM Project\Entities\Product p JOIN p.subcategoryId sc ORDER BY p.name ASC" 
$query = $em->createQuery($dql); 
$results = $query->getResult(); 
$products = array(); 

现在,因为我们已经在实体受保护的变量,你想要在你的对象getter和setter方法。 这对于格式化如何返回的内容非常有帮助的,等

foreach ($results as $product) 
{ 
    $products[] = array("id" => $product->getId(), 
         "name" => $product->getName(), 
         "subCategory" => $product->getSubcategoryId()       
         ); 
} 
+0

不错的细节在此响应,尤其是最后一节。 – cantera

+0

感谢有关表之间关系的信息,但实际上我希望在此查询中获得“子类别”。我澄清了我的问题,确切地说明了我的意思。 – pixel

+1

我不知道您的产品表中使用了哪个字段来检查可用性...所以我只需要调用字段可用性。 '$ dql =“SELECT sc FROM Project \ Entities \ Subcategory sc JOIN sc.products p WHERE p.availability = 1 ORDER BY p.name ASC”' –

相关问题