2011-10-28 40 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」' –

相關問題