2012-04-13 2 views
1

첫날 YII를보고 있는데 일부 테이블 사이의 관계를 해결하는 데 문제가 있습니다. 다음과 같이YII Active Record Join

내 테이블 구조는 다음과 같습니다 이 OWNER_NAME

어떻게 을 OWNER_ID : 이 pet_name ....

Pet_Owner_Link 이 이

은 소유자 OWNER_ID pet_id을 pet_id : 애완 동물

나는 애완 동물을 모두 얻는 것에 대해 갈 것인가? 주인에게 속한거야? 지금 AR 관계에 대한 내 머리를 잡으려고 정말 어려움을 겪고 있습니다.

+2

: 당신은 기본 키가이 같은 모델에 지정할 수 있습니다 : 마지막으로

public function primaryKey() { return 'owner_id'; } 

,이 같은 정보를 가져 오지 것이다 'Pet.owner_id' 칸? 여러 명의 소유자가있는 애완 동물을 미리 보십니까? http://www.yiiframework.com/doc/guide/1.1/en/database.arr과 같은 예제가있는 설명서를 읽었습니까? – DCoder

답변

1

이 의견은 DD.Jarod의 Yii AR 설명서 페이지에서 확인하십시오. http://www.yiiframework.com/doc/guide/1.1/en/database.arr#c970

"당신이 많은 관계로 많은 선언하면 관절 식 선언 내부 키의 순서는 'MY_ID, other_id'이어야합니다

class Owner extends CActiveRecord 
{ 
    public function relations() 
    { 
    return array(
     'pets'=>array(self::MANY_MANY, 'Pet', 
      'tbl_post_category(pet_id, owner_id)'), 
    ); 
    } 
} 
class Pet extends CActiveRecord 
{ 
    public function relations() 
    { 
    return array(
     'owners'=>array(self::MANY_MANY, 'Post', 
      'tbl_post_category(owner_id, pet_id)'), 
    ); 
    } 
} 
:
class Post extends CActiveRecord 
{ 
    public function relations() 
    { 
    return array(
     'categories'=>array(self::MANY_MANY, 'Category', 
      'tbl_post_category(post_id, category_id)'), 
    ); 
    } 
} 
class Category extends CActiveRecord 
{ 
    public function relations() 
    { 
    return array(
     'Posts'=>array(self::MANY_MANY, 'Post', 
      'tbl_post_category(category_id, post_id)'), 
    ); 
    } 
} 

그래서 코드의 모습

애완 동물과 소유자의 기본 키가 기본적으로 id 여야합니다 (pet_id/owner_id가 아님). 기본 키가 기본 명명 규칙과 일치하지 않거나 데이터베이스의 기본 키로 설정되지 않았다는 것을 명확히하지 않으면 Yii가 혼란 스러울 수 있습니다. 당신은`Pet_Owner_Link` 테이블을 필요로하는 대신 단순히 이유는 무엇

$owner = Owner::model()->findByPk((int)$id); 
foreach($owner->pets as $pet) 
{ 
    print $pet->name; 
} 
-1

나는 이것이 정확히 당신이 묻는 것이 아니라는 것을 알고 있습니다. 그러나 이것이 제가하는 방법입니다.

소유자 모델) (당신의 관계에서 수익을이 항목을 추가

'all_pets'=>array(self::HAS_MANY, 'Pet_Owner_Link','owner_id'), 

이 (당신의 관계에서이 항목을 추가) 수익을 Pet_Owner_Link 모델 :

'pet'=>array(self::BELONGS_TO, 'Pet', 'pet_id'), 

는 다음과 같은 애완 동물을 얻을

+1

특정 상황에서 작동합니다 (링크 테이블에서 다른 작업을 정렬하고 수행해야 할 때 실행했습니다). 대신 AR MANY_MANY 관계를 사용하면 훨씬 깨끗하고 명확합니다. – acorncom

+0

이 답변에 대해 -1 등급을 부여하는 이유는 무엇입니까? 나는 그것이 선택된 것이 아니라는 것을 이해하지만, -1은 비 감각적 인 대답을위한 것이며, 그렇지 않습니다. – jptsetung

관련 문제