WHERE condition di un Model

Vi faccio una domanda stupida, ma oggi la mia testa non ragiona.

Voglio settare una WHERE condition di default per un model.

Ho provato ad impostarlo sotto la funzione search() del Model aggiungendo un ‘criteria’ in questo modo:




$criteria=new CDbCriteria(

'condition'=>'active = 1',

));

...

...

return new CActiveDataProvider(get_class($this), array(

'criteria'=>$criteria,

));



Quando creo una CGridView (codice autogenerato da gii) mi viene filtrato, ma quando genero una CListView, la condizione non viene applicata.

Dove posso impostare una WHERE condition di default per tutto il model?

Un modo è questo.


Model::model()->findAll('campo = valore');

Se vuoi puoi applicare il "filtro" anche mentre chiami un datagrid in questo modo:




  $this->widget('zii.widgets.grid.CGridView', array(

      'id' => 'destinatari-grid',

      'dataProvider' => new CActiveDataProvider('Model', array(

          'criteria' => array(

              'condition' => 'campo = ' . ($valore),

          )

      )),

Grazie sensoorario,

io però vorrei impostare un filtro su tutto il Model in modo che ogni volta che lo richiamo venga già applicata la where condition senza che debba specificarla per ogni oggetto (ad esempio quando genero un CGridView).

Beh se vuoi che non vengano mostrati dei dati per tutto il model, … non metterli nella tabella.

Oppure creati un metodo pubblico nel tuo model che fornisca un CActiveDataProvider ottimizzato e riutilizzato in tutti i luoghi in cui viene caricato quel model.

Un’altra possibilità, potrebbe essere quella di crearti diversi search ciascuno che faccia al caso tuo. Però va da se che non credo vengano presi in automatico: tu comunque, la prima volta, dovresti andare a modificare tutti i vari CDataGrid, CListView e via dicendo.

Ho risolto utilizzando defaultScope.

Nel mio Model ho aggiunto:




public function defaultScope()

{

return array(

   'condition' => 'active = 1',

);

}



Ho sfruttato l’occasione per studiare gli scopes e il defaultScope

In questo modo ogni volta che genero una nuova istanza del mio model viene già filtrato con la WHERE condition ‘active = 1’

Molto interessante. Grazie dchan =). Per completezza ti chiedo: quel metodo va aggiunto nel model giusto?

Si, va aggiunto nel Model.

Aggiungo un’altra cosa che ‘ho scoperto’:

Quando genero il CActiveDataProvider da passare alla CListView, posso definire ulteriori ‘condition’ che si vanno a aggiungere quelle già definite nel Model tramite defaultScope. Ad es:

Nel Controller (aggiungo un ulteriore ‘condition’)




public function index() {

$dataProvider = new CActiveDataProvider('MioModel', array(

 'criteria'=>array(

  'condition'=>'campo_1 = true',

),

));


$this->render('index',array(

 'dataProvider'=>$dataProvider,

));

}



E nella view




php $this->widget('zii.widgets.CListView', array(

	'dataProvider'=>$dataProvider,

	'itemView'=>'_view',

));



La mia CListView estrarra tutti i records dal Model MioModel (che quindi è già filtrato per ‘active = 1’) e inoltre filtrerà per ‘campo_1 = true’

Per una volta sono io che ti dò un consiglio… ;)… e spero che sia corretto.

:rolleyes:

Questo sarebbe actionIndex?


public function index() {

$dataProvider = new CActiveDataProvider('MioModel', array(

 'criteria'=>array(

  'condition'=>'campo_1 = true',

),

));



E se ho bisogno di eliminare lo scope di default per un’action?

Si, giusto. actionIndex e non Index

Ho trovato la funzione resetScope() ma non sono riuscito a farla funzionare.

Se hai voglia di provare e scopri come fare… fammi sapere.


MyModel::model()->resetScope()->findAll()

L’ho provato al volo e funziona, che problemi di dà?