2011-07-26 6 views
4

누구든지이 문제에 직면했는지 궁금합니다.
두 테이블이 있다고 가정 해 봅니다 : 제품과 카트 (많은 상품과 많은 상품).

이제 가입 테이블에는 추가 열 수량 (특정 유형의 제품 몇 개가 장바구니에 있음)이 있습니다. 나는 또한 시도Many to Many, 다른 열이

 
public function relations() 
{  
    return array(
      'products'=>array(self::MANY_MANY, 'Product', 'cart_products(cart_id, product_id)'), 

    ); 
} 

:


내 문제는 내가 다음과 같은 관계를 통해 "양"열을 액세스 할 수 있다는 것입니다 행운과

 
'products'=>array(self::HAS_MANY, 'Product','product_id','through'=>'cart_products'), 

.

답변

14

Yii의 MANY_MANY 구현은 이후 Yii 버전에서 해결 될 수있는 제한 사항이 있습니다.

이 해결책은 MANY_MANY 테이블에 대해 하나 이상의 모델 클래스를 사용하는 것입니다. 예를 들어 AR 클래스 CartProduct를 만든 다음 장바구니의 관계가 될 것입니다 :

public function relations() 
{  
    return array(
      'cartProducts'=>array(self::HAS_MANY, 'CartProduct', 'cart_id'), 
      'products'=>array(self::HAS_MANY, 'Product', 'product_id', 'through' => 'CartProduct'), 
    ); 
} 

당신이 cartProducts 카트 인스턴스의 마법 공공 재산을에서 CartProducts 모델에 대한 참조를하고 업데이트 할 수 있습니다이 방법을 당신의 " 양".

이제 나는 그 문제에 대한 당신의 접근 방식이 맘에 들지 않는다는 것을 알았습니다. 카트의 제품 수를 유지하는 "양"열을 가지고 있습니다. 왜냐하면 두 가지 진실 (실제 양)을 유지해야하기 때문입니다. db의 장바구니에 매핑되는 제품 및 관련 테이블의 "amount"필드에있는 "amount"필드).이 db denormalization을 필요로하는 매우 많은 응용 프로그램이 없으면 제품을 가져 오기 위해 "카운터 관계"를 수행합니다 대신 다음과 같이 열에 가치 캐싱, 계산 (카트 모델에 다음 관계를 추가) :

public function relations() 
{  
    return array(
      'products'=>array(self::MANY_MANY, 'Product', 'cart_products(cart_id, product_id)'), 
      'productsAmount'=>array(self::STAT, 'Product', 'cart_products(cart_id, product_id)'), 

    ); 
} 

이 방법을, 당신은 cart-> protuctsAmount 속성을 호출 할 수 있으며 함께 실제 양을 반환합니다 시 mple 및 빠른 카운트 쿼리 (캐싱 될 것입니다.) 대신 장바구니 제품을 변경할 때마다 코드 또는 db 트리거에 의해 다시 생성되어야하는 캐싱 된 값에 의존해야합니다.

+0

대단히 감사합니다. 정확히 내가 바라던 답변입니다. 내가 일하고있는 가게는 제품 크기 나 색상과 같은 멋진 기능이 필요하지 않습니다. (나는이 제품 중 5 개, 그 중 3 개를 원합니다.) "칼럼은 일을 처리하지만 프로젝트가 더 커질 수 있다면 나는 당신의 접근법을 이해하고 그것을 확실히 사용할 것입니다. – mailo

+0

OP의 상황을 개선하지 않으셔서 고맙지 만 그의 질문에 대답 해 주셔서 감사합니다. 비슷한 상황이 발생하여 제공 한 답을 얻는 것이 매우 도움이됩니다. – Navarr