2011-10-28 7 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; 
} 

私が取得したいと思いProductsavailableフィールドを持っているすべてのSubcategories 1と等しい。 Ergo。利用可能な製品のみを持つサブカテゴリを取得します。

私はSQLのクエリを書く方法を知っていますが、これを達成する方法がわかりませんDQL

注釈を追加する必要がありますか?関連マッピングについて

答えて

3

あなたはあなたのエンティティ関係を宣言することから始めなければなりません。あなたのサブカテゴリには多くの製品(1対多)があると仮定します:

私はこのコードをテストしていませんので、いくつかのエラーがある場合は謝罪します。主に

/** 
* 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(); 

、私たちは私たちの実体で変数を保護しているので、あなたは、オブジェクトのセッターとゲッターをしたいと思います。 これは、コンテンツの返信方法などのフォーマットに非常に役立ちます。

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

このレスポンス、特に最後のセクションで詳しく説明しています。 – cantera

+0

テーブル間の関係についてありがとう、本当に私はこのクエリで 'サブカテゴリ'を得ることを望んでいました。私は何を意味するかを正確に特定するために質問を明確にしました。 – pixel

+1

在庫状況を確認するために商品テーブルでどの項目を使用しているのか分かりません。 '$ dql ="プロジェクト\エンティティ\サブカテゴリを選択します。SC JOIN sc.products p WHERE p.availability = 1 ORDER BY p.name ASC " –

関連する問題