2012-05-18 2 views
2

단방향 다 대 매핑을 사용하는 엔티티가 두 개 있습니다.Doctrine2 many-to-one 매핑에서 findby

여기 Product : 당신이 볼 수 있듯이

use Doctrine\Common\Collections\ArrayCollection; 

/** 
* @Entity 
* @Table(name="Product") 
* @gedmo:TranslationEntity(class="GPos_Model_Translation_ProductTranslation") 
*/ 
class GPos_Model_Product extends GPos_Doctrine_ActiveEntity { 
    /** 
    * @Id @Column(type="integer") 
    * @GeneratedValue 
    */ 
    protected $id; 

    /** 
    * @ManyToMany(targetEntity="GPos_Model_Category") 
    * @JoinTable(name="products_categories", 
    *  joinColumns={@JoinColumn(name="product_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@JoinColumn(name="category_id", referencedColumnName="id")} 
    *  ) 
    */ 
    protected $categories; 

    public function __construct() { 
     $this->categories = new ArrayCollection(); 
    } 

    public function addCategory(GPos_Model_Category $category) { 
     if (!$this->categories->contains($category)) 
      $this->categories->add($category); 
    } 
} 

은 $ 범주 GPos_Model_Category 엔티티의 ArrayCollection에 있습니다.

이제 어떻게 되나요? 이제 특정 카테고리의 모든 제품과 특정 카테고리의 가 아닌 인 모든 제품을 검색하고 싶습니다.

나는 $products = GPos_Model_Product::findByCategories($category->getId()); 을 시도했다 그러나 그것은 단지 나에게
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= '1'' at line 1을주고 $category의 ID 1은 내가 갈 수있는 방법이 아니다 추측입니다. 누구든지 그 문제를 어떻게 다룰 줄 압니까?

감사합니다.

답변

2

https://stackoverflow.com/a/9808277/1300454 덕분에 카테고리에있는 모든 제품을 선택하는 방법을 마침내 발견했습니다.

나는 자신의 솔루션을 약간 조정하여 일련의 범주 엔티티를 전달할 수 있었고이 범주에 속하는 모든 제품을 찾을 수있었습니다. 둘 이상의 엔티티를 제공하면 주어진 카테고리 중 적어도 하나에있는 제품을 리턴합니다.

다음
/** 
* 
* Takes an array of GPos_Model_Category entities as parameter and returns all products in these categories 
* @param array $categories 
*/ 
public static function findByCategories($categories) { 
    $categoryArray = array(); 
    foreach ($categories as $category) { 
     array_push($categoryArray, $category->getId()); 
    } 
    $qb = Zend_Registry::get('entityManager')->createQueryBuilder(); 
    $qb ->select('p') 
    ->from('GPos_Model_Product', 'p') 
    ->leftJoin('p.categories', 'c') 
    ->andWhere($qb->expr()->in('c.id', $categoryArray)); 

    return $qb->getQuery()->execute();; 
} 

당신이 그것을 호출하는 방법은 다음과 같습니다 : 여기

내 팅겨입니다 (내 제품 엔티티에서이 기능에 있음)이 경우 $ 범주에서
$products_cat = GPos_Model_Product::findByCategories(array($category)); 

혼자 엔티티입니다 그 이유 I 함수에 전달하기 전에 배열에 넣으십시오. 이것은 실제로 부속을 사용

/** 
* 
* Takes an array of GPos_Model_Category entities as parameter and returns all products not in these categories 
* @param array $categories 
*/ 
public static function findByNotCategories($categories) { 
    $categoryArray = array(); 
    foreach ($categories as $category) { 
     array_push($categoryArray, $category->getId()); 
    } 
    $qb = Zend_Registry::get('entityManager')->createQueryBuilder(); 
    $qb2 = Zend_Registry::get('entityManager')->createQueryBuilder(); 
    $qb->select('p') 
    ->from('GPos_Model_Product', 'p') 
    ->where($qb->expr()->notIn('p.id', 
     $qb2->select('p2.id') 
     ->from('GPos_Model_Product', 'p2') 
     ->leftJoin('p2.categories', 'c') 
     ->andWhere($qb->expr()->in('c.id', $categoryArray)) 
     ->getDQL() 
    )); 

    return $qb->getQuery()->execute(); 
} 

: 여기

그리고

당신이 카테고리의 특정 카테고리 또는 목록에없는 제품을 찾을 방법입니다. 주어진 카테고리 (subselect)에있는 모든 제품 ID를 선택한 다음 subselect 결과에없는 모든 제품을 선택합니다. 내 일은 끝났어!