Gridview E Query 'da Fare A Mano'

Come sempre io non so fare a scegliere titoli migliori…

Vi spiego: ho un processo in background, scatenato dall’azione di un utente. Questo prevede di scrivere su redis la percentuale di avanzamento, la pagina web controlla la percentuale e la mostra all’utente. fino a qua una meraviglia, potete anche chiudere il browser e riaprirlo e vedete la percentuale di avanzamento aggiornata in tempo reale (ogni 2 secondi tramite ajax).

Ok.

cosa fa il processo? raccoglie tramite una operazione che coinvolge decine di milioni di record, alcune centinaia di id che corrispondono a record ‘difettosi’. questi id rimangono in redis, in modo che l’utente per alcune ore veda sempre gli stessi risultati e non riesegua quel processo massacrante e lunghissimo.

Il primo problema sta nel fatto che al termine devo fare vedere questi record, facendo una select * from tabella where id in (quelli letti da redis) e permettendo all’utente di scorrere tra le pagine.

Il secondo problema è che in realtà il risultato sono DUE liste di id e devo fare una union per forza… come si fa ?!

Domanda: come faccio a dare in pasto alla GridView (che usa model->search() di solito, quindi un CActiveDataProvider), la mia query ?

Devo creare un CActiveDataProvider, ma come gli compongo i criteria a mano ?

Oppure c’è una strada migliore ?

Non ho molta esperienza in yii, tanto meno di best practices, però farei questi tentativi…

Preso il codice di una admin qualsiasi (quella generata da gii)




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

	'id'=>'reparto-grid',

	'dataProvider'=>$model->search(),

	'filter'=>$model,

	'columns'=>array(

		'id',

		'nome',

		'attivo',

		array(

			'class'=>'CButtonColumn',

		),

	),

)); ?>



Se tu editi il valore degli attributi di ‘filter’=>$model, modifichi il filtro. Per esempio $model->id=1, ti farà vedere solo i record con id=1… e così via per gli altri attributi.

Nel tuo caso specifico, andrei direttamente nel model e modificherei la search() utilizzata dalla cgridview… (oppure ti crei un altro metodo). Ovviamente puoi anche passare parametri $model->search($parametro1)

e poi andare nel modello e modificare il metodo




public function search($parametro1)

	{

		$criteria=new CDbCriteria;


		$criteria->compare('attributo1',$parametro1);

		$criteria->compare('attributo2',$this->attributo2);

		$criteria->compare('attributo3',$this->attributo3);


		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

		));

	}

}



Alla fine della fiera, devi "soltanto" creare il $criteria ad hoc che selezioni i dati da te richiesti, poi non so quale possa essere il metodo corretto… magari gli passi un array di ID come $parametro1