2012-04-28 4 views
1

두 개의 테이블 tbl_studenttbl_record이 있습니다. 나는 그들과 합류하기를 원하지만 나는 Yii에서 그것을하는 법을 모른다. PHP를 사용하고 있습니다. 나는 자습서 내가 코드에있을 어떤 모델 코드가 위치해야한다 기능을 모르는 CDbCriteriaYii의 테이블 조인

'join'=>"INNER JOIN...." 

을 언급 발견했다. tbl_student은 기본 키가 stud_id이며 tbl_record은 기본 키가 record_id이고 외래 키가 stud_id입니다. 누군가 제게 단계별 절차를 알려주시겠습니까?

+2

당신은 무엇을해야할지 모른다. 나는 당신이 yii 더 깊이 배울 것을 제안합니다. –

답변

9

수동 조인을 사용하지 마십시오. Active Record를 사용하면이 작업을보다 쉽게 ​​수행 할 수 있습니다. 그러나 전체 "단계별 프로세스"를 제공한다고해서 실제로 생각만큼 도움이되지는 않습니다. 기본 사항을 직접 배우고 구체적인 질문을해야합니다. 이 대답이 너무 혼란 스럽다면 Alfredo가 옳다. 계속하기 전에 프레임 워크를 배우는 데 더 많은 시간을 할애해야한다.

1 단계 : 각 모델에서 테이블 관계를 지정하십시오. 데이터베이스 스키마가 외래 키를 사용하면 (그것은 절대적으로 한다), 다음 gii 모델 발생기 그렇지 않으면 수동으로 선언 할 필요가 자동으로 다음을 확인할 수 있습니다

/** 
* @property Record[] $records 
*/ 
class Student extends CActiveRecord { 
    // other code... 
    public function relations() { 
    return array(
     // other relations 
     array('records', self::HAS_MANY, 'Record', 'stud_id'), 
    ); 
    } 
} 

/** 
* @property Student $student 
*/ 
class Record extends CActiveRecord { 
    // other code... 
    public function relations() { 
    return array(
     // other relations 
     array('student', self::BELONGS_TO, 'Student', 'stud_id'), 
    ); 
    } 
} 

2 단계 : 액티브 레코드와를 사용 컨트롤러 동작의 관계. 이것은 당신이하려는 일에 크게 의존합니다.

예 : 한 명의 학생을 모든 기록으로로드하십시오. 액션에 직접 데이터를 출력한다는 점에 유의하십시오. 이것은 나쁜 생각이며 간단하게하기 위해 여기에서 사용합니다. 실제 애플리케이션에서는이 데이터 대신 뷰를 렌더링하려고합니다.

public function actionStudentInfo($id) { 
    $student = Student::model()->with('records')->findByPk($id); 
    if(!$student) { 
    throw new CHttpException(404, "Student not found!"); 
    } 
    echo "<h2>Found the requested student with details:</h2>", 
    "<pre>", htmlspecialchars(print_r($student->attributes, true)), "</pre>"; 
    if(count($student->records)) { 
    echo "<h3>Student records:</h3>", "<ul>"; 
    foreach($student->records as $record) { 
     echo "<li><pre>", htmlspecialchars(print_r($record->attributes, true)), "</pre></li>"; 
    } 
    echo "</ul>"; 
    } else { 
    echo "<p>Student has no records...</p>"; 
    } 
} 

핵심 부분은 ->with('records')입니다. 이는 Active Record 시스템에 Student 모델의 records 관계 데이터를 쿼리에 포함하도록 지시합니다. 액티브 레코드는 그 관계를 읽어서 질의와 반환 된 결과에 포함시킵니다. StudentRecords$student->records (이것은 배열이됩니다)에서 사용할 수 있습니다.

관계 사양에 추가 할 수있는 많은 세부 정보가 있습니다. 예를 들어 주문을 시행하려면 특정 순서없이 해당 레코드를 가져오고, 'order' => 'field_name ASC'을 지정할 수 있습니다.

활성 레코드 사용에 대한 자세한 내용은 Yii 설명서에서 Active Record, Relational Active Record입니다.