Metodo Search Con Join

Ho due tabelle(inventario_pc, arcdipan) senza chiave esterna o altri vincoli tra loro, entrambe hanno una colonna "cod_dip" col codice del dipendente. Vorrei fare una join tra le due tabelle nel metodo search del model inventarioPc in modo tale che tramite il cod_dip da arcdipan riesco a prendere il parametro cognome.

Questo è ciò che ho fatto riprendendo questo topic: http://www.yiiframework.com/forum/index.php/topic/13377-solved-how-do-i-search-on-a-join-in-adminphp/




public function search()

	{

		// Warning: Please modify the following code to remove attributes that

		// should not be searched.


		$criteria=new CDbCriteria;

		$criteria->join = 'LEFT JOIN ARCDIPAN as tbl_alias ON tbl_alias.cod_dip =  cod_dip';

		

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

		$criteria->compare('cod_dip',$this->cod_dip,true);

		$criteria->compare('nomecomputer',$this->nomecomputer,true);

		$criteria->compare('os',$this->os,true);

		$criteria->compare('ram',$this->ram,true);

		$criteria->compare('disco',$this->disco,true);

		$criteria->compare('processore',$this->processore,true);

		$criteria->compare('licenza',$this->licenza,true);

		$criteria->compare('ip_pc',$this->ip_pc,true);


		$criteria->compare('tbl_alias.COGNOME',$this->tbl_alias->COGNOME, true);

		

		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

		));

	}



Nella view:




$this->widget('bootstrap.widgets.TbGridView',array(

		'type'=>'striped bordered condensed',

		'id'=>'inventario-pc-grid',

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

		'filter'=>$model,

		'columns'=>array(

			//'id_postazione',

			'',

			'nomecomputer',

			'os',

			'ram',

			'disco',

			'ip_pc',

			'ARCDIPAN.COGNOME',

			array(

				'class'=>'bootstrap.widgets.TbButtonColumn',

			),

		),

	));



Io eviterei di modificare il metodo search in quel modo. Verrebbe eseguita sempre quella join. Preferirei usare gli scopes, li trovo più comodi.

E’ la prima volta che li utilizzo, o meglio mi è sempre piaciuto utilizzarli.

Le mie due tabelle sono in allegato.

Ho creato il metodo nel model InventarioPc:




public function viewPostazioni()

	{

		$this->getDbCriteria()->mergeWith(array(

				'select'=>'a.COGNOME, a.NOME',

				'join'=>'LEFT JOIN ARCDIPAN as a ON a.CODDIP =  cod_dip',

		));

		return $this;

	}



Poi nel controller ho messo il richiamo al metodo:




public function actionAdmin()

	{


		$model=InventarioPc::model()->viewPostazioni()->findAll();




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

			'model'=>$model,

		));

	}



E nella view:




$this->widget('bootstrap.widgets.TbGridView',array(

		'type'=>'striped bordered condensed',

		'id'=>'inventario-pc-grid',

		'dataProvider'=>$model,

'filter'=>

		'columns'=>array(

			//'id_postazione',

			'',

			'nomecomputer',

			'os',

			'ram',

			'disco',

			'ip_pc',

			/*array(            

                  'name'=>'search_location',

                  'value'=>'$data->ARCDIPAN->COGNOME',

                  'header'=>'ARCDIPAN.COGNOME',

                ),*/

			/*

			'processore',

			'licenza',

			*/

			array(

				'class'=>'bootstrap.widgets.TbButtonColumn',

			),

		),

	));



Ma non capisco come passare il "provider". Mi servirebbe creare nella view una gridview con filtro.

Il dataProvider è la variabile $model, basta fare si che quel $mode, sia un provider customizzato da te.

Capito.

Ho "risolto" il problema creando una relation cosi:




public function relations()

	{

		return array(

				'dipendente' => array(self::BELONGS_TO, 'ARCDIPAN', '', 'on' => 'cod_dip=CODDIP'),

		);

	}



e poi un provider customizzato.