Modifiche Al Model Per Usare I Valori Di Default Del Db

Ciao a tutti,

vi è mai capitato di dover lasciare il compito di compilare un campo (default) alle regole impostate nel DB anziché quelle definite su Yii ?

Vi faccio un esempio :

Definisco sul db una tabella di questo tipo :

create table TAB1

(

ID INTEGER not null,

NOME VARCHAR2( 8 ) not null,

TIPO VARCHAR2(1) default ‘A’ not null,

DATA_INS DATE default SYSDATE not null,

)

ora come faccio a modificare il model in modo che quando utilizzo l’azione “Create” evito che Yii inserisca i campi che voglio siano lasciati in gestione (come dato di default) al DB ?

Premetto che vorrei lasciare definiti i due campi nel model (TIPO e DATA_INS in questo caso) per poter comunque utilizzarli in azioni di Update o Select o Search.

Vorrei ottenere questo:

INSERT INTO "TAB1" ("ID", "NOME") VALUES

(:yp0, :yp1) RETURNING "ID" INTO :RETURN_ID. Bound with :RETURN_ID=NULL,

:yp0=‘1’,

:yp1=‘PROVA’,

anziche questo:

(che genera anche un errore in quanto ad es. SYSDATE non andrebbe tra apici ma Yii lo crea così)

INSERT INTO "TAB1" ("ID", "NOME", "TIPO", "DATA") VALUES

(:yp0, :yp1, :yp2, :yp3) RETURNING "ID" INTO :RETURN_ID. Bound with :RETURN_ID=NULL,

:yp0=‘1’,

:yp1=‘PROVA’,

:yp2='SYSDATE ',

:yp3=’\‘A\’ ’

Spero di essermi spiegato abbastanza bene.

Grazie a chi vorrà darmi una mano.

Ciao

Fossi in te punterei sugli eventi beforeSave() o afterValidate(), a seconda di ciò che devi andare esattamente a fare, valutando per mezzo della proprietà isNewRecord se stiamo trattando un create o un update, e quindi sostituendo eventuali valori di default del DB con quelli necessari…

oppure potresti gestire i valori di default semplicemente tramite le rules del model stesso (usando anche la chiave "on" per stabilire lo scenario specifico sul quale usare il valore).

Spero di essere stato utile!

Quindi non c’è modi di evitare che Yii inserisca nella INSERT dei campi che non voglio siano esplicitamente inseriti?

Puoi sempre comporre la query a mano con il query builder. Creare un costruttore che popoli quei campi come desideri tu. Creare un behavior che si preoccupi di trattare quei campi nel modo più adatto alle tue esigenze. Usare afterSave o eforeSave. Usare CDbExpression("now()") anche se non sono certo di questa sintassi. […] e così via

Se hai nelle tabelle del DB dei dati di default mi sembra corretto che Yii segua questa scelta…le indicazioni sui models o sul query builder (in caso specifico) credo siano le scelte migliori…e soprattutto fanno ciò che chiedi! :)

Sono d’accordo, il problema è che non lo fa nel modo corretto.

Se imposto nel DB che un campo ha come valore di default SYSDATE (cioè la data di sistema al momento dell’inserimento) YII utilizza questo valore in questo modo: campo = ‘SYSDATE’ ovvvero come stringa anzichè campo = SYSDATE, generando un errore e cosi per altri tipi di dato…

Prova a mettere come dato di default "CURRENT_TIMESTAMP".