Yii – CGridView with Relation (show gridview)

Yii – CGridView with Relation (Relasi)

1 Vote

Buat yg kesusahan untuk membuat CGridView dengan relasi antar table mungkin bisa di check step by stepnya dibawah ini :

MODELS
—————-
1. Usahakan gunakan generator GII -> CRUD untuk membuat CGridView bagi yang belum tau. setelah dibuat CRUD nya,
Pastikan relasi database sudah dibuat antar models. contoh :

	public function relations()
	{
		// NOTE: you may need to adjust the relation name and the related
		// class name for the relations automatically generated below.
		return array(
			'namaRelasi' => array(self::BELONGS_TO, 'Classnya', 'pknya'),
		);
	}

2. Check juga status field relasi, apakah sudah masuk kedalam aturan search ?

public function rules()
	{
		return array(
			// ...
			// The following rule is used by search().
			// Please remove those attributes that should not be searched.
			array('field1, field2, field3, field_relasi1, field_relasi2', 'safe', 'on'=>'search'),
		);
	}

3. Check juga kondisi pencariannya :

	public function search()
	{
		$criteria=new CDbCriteria;
		$criteria->with=array('namaRelasi');
		$criteria->compare('t.field1',$this->field1);
		$criteria->compare('t.field2',$this->field2);
		$criteria->compare('t.field3',$this->field3);
		$criteria->compare('namaRelasi.field_relasi1',$this->relasi1,true);
		$criteria->compare('namaRelasi.field_relasi2',$this->relasi2,true);
		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
		));
	}

VIEW
—————-
4. Rubah di tampilan columnya seperti contoh dibawah ini :

	'columns'=>array(
		'field1',
		'field2',
		'field3',
		array (
			'name'=>'field_relasi1',
			'value'=>'$data->namaRelasi->field_relasi1',
		),
		array (
			'name'=>'field_relasi2',
			'value'=>'$data->namaRelasi->field_relasi2',
		),
		array(
			'class'=>'CButtonColumn',
		),
	),

Semoga dapat membantu tutorial yang saya buat.

Yii Examples of Using CDbCriteria

Examples of Using CDbCriteria
Basic Usage

$Criteria = new CDbCriteria();
$Criteria->condition = "price > 30";
$Products = Product::model()->findAll($Criteria);

OR

//An example using the constructor to populate the properties.
$Criteria = new CDbCriteria(array('condition' => 'price > 30'));
$Products = Product::model()->findAll($Criteria);

Personally, I like to go with the first approach. I think it’s generally easier to read, but that’s just my personal preference.
Adding A Limit

$Criteria = new CDbCriteria();
$Criteria->condition = "price > 30";
$Criteria->limit = 1;
$Products = Product::model()->findAll($Criteria);

Limit with Offset

$Criteria = new CDbCriteria();
$Criteria->condition = "price > 30";
$Criteria->limit = 1;
$Criteria->offset = 1;
$Products = Product::model()->findAll($Criteria);

Ordering Results

$Criteria = new CDbCriteria();
$Criteria->condition = "price > 30";
$Criteria->limit = 1;
$Criteria->offset = 1;
$Criteria->order = "name ASC";
$Products = Product::model()->findAll($Criteria);

Limiting Selected Fields

$Criteria = new CDbCriteria();
$Criteria->condition = "price > 30";
$Criteria->limit = 1;
$Criteria->offset = 1;
$Criteria->order = "name ASC";
$Criteria->select = "id, name";
$Products = Product::model()->findAll($Criteria);

Example relation with :

$criteria = new CDbCriteria;
$criteria->with = array('foreign_table1',
                        'foreign_table2', 
                        'foreign_table2.foreign_table3');
$criteria->together = true; // ADDED THIS
$criteria->select = array('id');
$criteria->condition = "foreign_table1.col1=:col_val AND 
                        foreign_table3.col3=:col_val2";
$criteria->params = array(':col_val' => some_val, ':col_val2' => other_val);
$criteria->order = 'foreign_table3.col5 DESC';
$criteria->limit = 10;