2014-04-21 10 views
9

Mam model ucznia (id, imię, school_id) i model szkoły (id, imię, ...) Schemat relacji: szkoła ma wielu uczniów, uczeń może mieć tylko jedną szkołę.Zapisywanie relacji w formularzach yii2 - jak uniknąć duplikowania się atrybutów?

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

Teraz chcę uczynić wyboru dla każdego ucznia w szkole stworzyć postać:.

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

($ model jest instancja Szkoła Dla uproszczenia przyjmijmy, że nie ma dużo studentów - tak kontrola pól jest wystarczająca)

Teraz, jeśli chcę dodać regułę sprawdzania poprawności, aby pozwolić maksymalnie 5 studentom (używając metody School :: rules()) - na formularzu przesyłam otrzymuję "Próbuję ustawić uczniom atrybut" tylko do odczytu "

OK, oznacza to, że relacje AR są atrybutami tylko do odczytu w modelach.

Ale jak mogę używać Yii2 activeForm i walidacji używając reguł wtedy, bez stworzenia kolejnego atrybutu fikcyjnego (student_ids), który nie zostanie zapisany do db i będzie używany wyłącznie do celów sprawdzania poprawności?

Czy istnieje "właściwa" droga? Dzięki!

+2

Też myślałem o tym problemie i robiąc kolejny model wyłącznie dla formularza. Jakie rozwiązanie wymyśliłeś? –

+0

Zazwyczaj używam fałszywych atrybutów [fieldname] _ids, które akceptują dane wejściowe i mogą mieć dołączone reguły sprawdzania poprawności. W złożonych przypadkach właściwym sposobem byłoby stworzenie osobnego modelu, takiego jak Ty :) –

Odpowiedz

1

Jeśli rozumiem to poprawnie, to czego potrzebujesz, to jak chcesz 5 pól wyboru uczniów pokazanych w modelu szkolnym.

W tym przypadku być może nie trzeba przeprowadzać sprawdzania oryginalności.

Wystarczy zdefiniować kolejną relację jak:

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

Tak, że za każdym razem u dostać z listy studentów za pomocą tej funkcji, będzie ona dostać tylko top 5 rekordy.

Powiązane problemy