2014-04-21 3 views
9

학생 모델 (id, name, school_id)과 학교 모델 (id, name, ...) 관계 스키마는 : 학교는 학생이 많으며 학생은 한 개의 학교 만 가질 수 있습니다.yii2 형식의 관계 저장 - 특성의 중복을 방지하는 방법?

<?php 
class School extends \yii\db\ActiveRecord 
{ 
/*.....*/ 
public function getStudents() 
{ 
    return $this->hasMany(Student::className(), ['school_id' => 'id']); 
} 
/*.....*/ 
} 
?> 

은 지금은 학교에 각 학생 작성 양식 확인란을 렌더링 할 :.

<?= $form->field($model, 'students')->checkboxList(ArrayHelper::map($allStudents, 'id', 'name')) ?> 

($ 모델 학교 인스턴스 단순화를 위해 이제 많은 학생들이 아니라는 것을 가정하자 - 그래서 체크 박스 컨트롤이면 충분)

양식 등록시 최대 5 명의 학생 (School :: rules() 메서드 사용)을 허용하는 유효성 검사 규칙을 추가하려면 "읽기 전용 속성 학생 설정 시도"

좋습니다. AR 관계는 모델에서 읽기 전용 속성입니다.

하지만 YII2 activeForm 및 유효성 검사를 규칙을 사용하여 어떻게 사용할 수 있습니까? 다른 가짜 속성 (student_ids)을 만들지 않고 db에 저장되지 않고 유효성 검사 목적으로 만 사용됩니까?

"올바른"방법이 있습니까? 감사합니다.

+2

나는 또한이 문제에 대해 생각해 왔으며 다른 형식의 모델 만 만들었다. 어떤 해결책을 생각해 냈습니까? –

+0

일반적으로 입력을 허용하고 유효성 검사 규칙을 첨부 할 수있는 허위 속성 [fieldname] _ids를 사용합니다. 복잡한 경우에 올바른 방법은 별도의 모델을 만드는 것입니다. :) –

답변

1

정확하게 이해한다면 U는 학교 모델에 표시된 5 개의 학생 확인란을 원한다고 생각합니다.

이 경우 유효성 검사를 수행하지 않아도됩니다.

그냥 같은 다른 관계를 정의 할 때마다 u는이 기능을 사용하여 학생 목록을 가져 그래야

public function getStudentsForSchool() 
{ 
    return $this->hasMany(Student::className(), ['school_id' => 'id'],'limit'=>5); 
} 

을, 그것은 단지 상위 5 개 기록을 얻을 것이다.