2011-10-28 3 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

당신은 당신의 엔티티의 관계를 선언하는 것으로 시작해야한다. 귀하의 하위 카테고리에는 많은 제품 (일대 다)이있을 수 있다고 가정합니다 :

이 코드를 테스트하지 않았으므로 약간의 오류가있을 경우 사과드립니다. 대개.

/** 
* 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

재고 확인을 위해 Products 테이블에서 어떤 필드를 사용하고 있는지 알 수 없으므로 필드 가용성을 호출하겠습니다. '$ dql = "Project \ Entities \ Subcategory SC에서 선택하십시오. SC.products WHERE p.availability = 1 ORDER BY p.name ASC" –

관련 문제