Yii Framework Forum: WHERE condition di un Model - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

WHERE condition di un Model Rate Topic: -----

#1 User is offline   dchan 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 32
  • Joined: 28-March 11
  • Location:Italy

Posted 25 May 2011 - 04:38 AM

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?
0

#2 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,987
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 25 May 2011 - 05:43 AM

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),
          )
      )),

0

#3 User is offline   dchan 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 32
  • Joined: 28-March 11
  • Location:Italy

Posted 25 May 2011 - 06:18 AM

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).
0

#4 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,987
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 25 May 2011 - 07:10 AM

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.
0

#5 User is offline   dchan 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 32
  • Joined: 28-March 11
  • Location:Italy

Posted 25 May 2011 - 09:15 AM

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'
0

#6 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,987
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 25 May 2011 - 09:17 AM

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

#7 User is offline   dchan 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 32
  • Joined: 28-March 11
  • Location:Italy

Posted 25 May 2011 - 09:30 AM

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.
1

#8 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,987
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 25 May 2011 - 10:32 AM

:rolleyes:
Questo sarebbe actionIndex?

public function index() {
$dataProvider = new CActiveDataProvider('MioModel', array(
 'criteria'=>array(
  'condition'=>'campo_1 = true',
),
));

0

#9 User is offline   Diegovl 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 96
  • Joined: 27-February 11

Posted 25 May 2011 - 10:57 AM

View Postdchan, on 25 May 2011 - 09:15 AM, said:

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'


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

#10 User is offline   dchan 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 32
  • Joined: 28-March 11
  • Location:Italy

Posted 25 May 2011 - 11:30 AM

View Postsensorario, on 25 May 2011 - 10:32 AM, said:

:rolleyes:
Questo sarebbe actionIndex?

public function index() {
$dataProvider = new CActiveDataProvider('MioModel', array(
 'criteria'=>array(
  'condition'=>'campo_1 = true',
),
));



Si, giusto. actionIndex e non Index
0

#11 User is offline   dchan 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 32
  • Joined: 28-March 11
  • Location:Italy

Posted 25 May 2011 - 12:22 PM

View PostDiegovl, on 25 May 2011 - 10:57 AM, said:

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


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

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

#12 User is offline   Diegovl 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 96
  • Joined: 27-February 11

Posted 28 May 2011 - 08:02 AM

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


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

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users