2014-04-21 13 views
9

Ho modello di studente (id, nome, school_id) e modello di scuola (id, nome, ...) Lo schema di relazione è: la scuola ha molti studenti, lo studente può avere solo una scuola.Salvataggio delle relazioni nelle forme yii2: come evitare la duplicazione negli attributi?

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

Ora voglio rendere caselle di controllo per ogni studente sulla Scuola creare la forma:.

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

($ modello è esempio Scuola Per semplicità supponiamo che non ci sono un sacco di studenti - così controllo caselle di controllo è sufficiente)

Ora, se voglio aggiungere regola di convalida per consentire un massimo di 5 studenti (usando scuola :: norme() metodo) - il modulo di presentare ottengo "Cercare di impostare attributo di sola lettura gli studenti"

Ok, questo significa che le relazioni AR sono attributi di sola lettura nei modelli.

Ma come posso utilizzare Yii2 activeForm e le convalide utilizzando le regole quindi, senza la creazione di un altro attributo fasullo (student_ids) che non verrà salvato in db e verrà utilizzato esclusivamente per scopi di convalida?

Esiste un modo "giusto" qui? Grazie!

+2

Ho anche pensato a questo problema e ho creato un altro modello esclusivamente per il modulo. Che soluzione hai trovato? –

+0

In genere utilizzo _id di attributo false [nomeCampo] _ids che accetta input e può avere regole di convalida allegate. Nei casi complessi il modo giusto sarebbe creare un modello separato come fai tu :) –

risposta

1

Se ho capito bene, hai bisogno di solo 5 caselle di controllo studente mostrate nel modello scolastico.

In questo caso, forse non è necessario effettuare la convalida.

basta definire un'altra relazione come:

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

modo che ogni volta u ottenere la lista degli studenti di utilizzare questa funzione, sarà solo i primi 5 record.

Problemi correlati