Afterfind E Beforesave


(Nimbus4t) #1

Ciao a tutti,

ho una semplicissima domanda da chiedervi (essendo newbie, spero non sia troppo stupida).

In una tabella del DB ho creato un campo che può essere 0 o 1 e che significa che un utente è di un certo tipo.

Esempio: 0 = allievo, 1 = istruttore

Ovviamente quando visualizzo le proprietà dell’utente nelle view quel campo è popolato con 0 o 1 mentre vorrei far vedere l’attributo allievo o istruttore.

Pensavo di mettere questa banale logica nel model "Utente" nei metodi afterFind e beforeSave che fanno questa semplice trasformazione.

Secondo voi è corretto usare quei metodi nel model o sarebbe meglio lavorare nel controller?

Grazie


(Sensorario) #2

Secondo me ti conviene semplicemente trattare quel campo come una stringa ed eliminare questo tipo di problema. Che cosa te ne viene dal salvare un campo 0 oppure 1 e non direttamente ‘allievo’ oppure ‘istruttore’?


(St4nny) #3

puoi usare sicuramente l’afterfind, ma se non hai particolari esigenze che nel model/nei model, l’attributo sia diversamente tipizzato… puoi fare una cosa del genere:

nelle view


 

select per le form:

 echo $form->dropDownList($model, 'attributo', Model::userOptions);

come visualizzarlo:

 echo Model::userOptions($model->attributo);



nel model




public static function userOptions($code=NULL) {

                $_items = array(

        0 => 'Allievo',

        1 => 'Istruttore',

    );

                if (isset($code))

                        return $_items[$code];

                else

                        return $_items;

}




(Nimbus4t) #4

Ciao e grazie per la risposta.

Era per avere un DB più pulito; in effetti devo creare un campo nel DB con due soli attributi possibili quindi dovrei usare o un campo binario o un ENUM o SET.

Siccome nelle "best practice" di mysql ho visto che per queste cose usare un ENUM o SET non conviene volevo farlo con un campo binario.

Se usassi un campo stringa potrei inserire nel DB qualsiasi stringa mentre il dominio dei miei dati è composto da due soli elementi.

Certo potrei sempre controllare lato applicativo che i dati inviati siano sempre e solo quei due possibili…controllo che dovrei comunque fare in un Controller o nel Model.

Grazie


(Sensorario) #5

Valuta sempre tu il trade off tra avere un db in terza forma normale o fare meno join possibile. Pensaci: se ti limiti ad avere un campo stringa, ed una compo da scegliere, il codice ed i calcoli da fare sono pochi. Se sai già a priori che non metterai altri valori, è davvero così importante trasformare un campo in numerico? Sarebbe meno leggibile. Sicuramente ti sei proposto questa strada perché sei abituato ad usare chiavi esterne, ma qui parliamo di due soli valori. Che vantaggi trai dal scegliere una strada piuttosto che un’altra?


(Nimbus4t) #6

Solo vantaggio pulizia DB.

Cmq, potrei usare un ENUM e risolvere il tutto visto che gli attibuti sono solo due.

Grazie


(Matteo Falsitta) #7

Io uso gli enum e creo le dropdown leggendo la descrizione della tabella dal db:




		$attr=$this->attribute;

		CHtml::resolveNameID($this->model,$attr, $this->htmlOptions);

		$type=$this->model->tableSchema->columns[$attr]->dbType;

		if (strpos($type, 'enum(')!== false){

			$off=strpos($type,"(");

			$enum=substr($type, $off+1, strlen($type)-$off-2);

			$keys=str_replace("'",null,explode(",",$enum));

			for($i=0;$i<sizeof($keys);$i++)

				$values[$keys[$i]]=Yii::t('enumItem',$keys[$i]);

			return $values;

		}



Cosi’ se ti compare un altro valore non devi fare altro che alterare il db.