2014-04-21 19 views
9

Öğrenci modelim var (id, ad, school_id) ve Okul modeli (id, isim, ...) İlişki şeması: okulda birçok öğrenci var, öğrenci sadece bir okula sahip olabilir.Yii2 formlarındaki ilişkilerin kaydedilmesi - özniteliklerde çoğaltmanın nasıl önlenir?

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

Şimdi School her öğrencinin oluşturmak formu onay kutularını işlemek istiyorum:.

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

($ modeli Okul örneğidir Kolaylık olması açısından öğrencilerinin bir sürü olmadığını varsayalım - bu yüzden onay kutularının denetimi yeterlidir)

Şimdi, maksimum 5 öğrenciye izin vermek için geçerlilik kuralı eklemek istiyorsam (School :: rules() yöntemini kullanarak) - formda gönderim olsun "Salt okunur öznitelik öğrenmeye çalışıyorum"

Tamam, bu AR ilişkilerinin modellerde salt okunur nitelikleri olduğu anlamına gelir.

Yii2 activeForm ve doğrulamalarını kurallar kullanarak nasıl kullanabilirim, daha sonra db'ye kaydedilmeyecek ve yalnızca doğrulama amacıyla kullanılacak başka bir sahte öznitelik (student_ids) oluşturmadan nasıl kullanabilirim?

Burada "doğru" bir yol var mı? Teşekkürler!

+2

Ayrıca bu problemi düşünüyorum ve sadece forma başka bir model yapıyorum. Hangi çözümle geldin? –

+0

Genellikle giriş kabul eden ve geçerlilik kurallarının eklenmiş olabilen sahte alan [fieldname] _ids kullanıyorum. Karmaşık durumlarda doğru yol, yaptığınız gibi ayrı bir model oluşturmak olacaktır :) –

cevap

1

Eğer doğru anlıyorsam, ihtiyaç duyduğunuz şey sadece okul modelinde gösterilen 5 öğrenci onay kutusunu istemektir.

Bu durumda, belki de doğrulama yapmanıza gerek yoktur.

Tıpkı başka ilişkiyi tanımlar: Her zaman u bu fonksiyonu kullanarak öğrenci listesini almak Böylece

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

, sadece ilk 5 kayıtlarını alacak.