Filter CActiveDataProvider, berdasarkan field di tabel lain dengan Relasi ONE to MANY,

Artikel ini sebetulnya sudah saya posting di Group Facebook, Yii PHP Framework Indonesia…tapi saya tau, artikel FB itu cepat termakan usia. Artikel2 lama sulit diretrieve dan dibaca… so saya posting ulang disini sapa tau ada yang perlu dan nyari2 code ini…


Pernah alami kasus yang mirip seperti ini tidak?.. Memfilter data yang tampil di CActiveDataProvider berdasarkan field yang ada di tabel lain yang memiliki relasi ONE to MANY? Contoh kasus seperti di bawah ini, aplikasi Jurnal Akunting… Jurnal memiliki Tabel Master dan Tabel Detail dengan relasi ONE to MANY. Dengan menggunakan CActiveDataProvider kita akan menampilkan data seluruh jurnal, tapi bagaimana cara memfilter CActiveDataProvider (dlm hal ini Tabel master Jurnal) yang di tabel detailnya ada Akun Kas Besar misalnya?..

Meskipun Class CActiveDataProvider meng-implement Class CModel, tapi CActiveDataProvider tidak memiliki function "With" untuk dapat menyertakan tabel relasi Journal Detail, akibatnya kita tidak bisa memfilter CActiveDataProvider berdasarkan field di tabel relasinya … gimana cara ngakalinnya?.. Ini saya ketemu solusinya…

#Controller dan actionnya adalah: /tPosting/index

public function actionIndex($acc=null)

{

$criteria=new CDbCriteria;

$criteria->compare(‘state_id’,1);

if(isset($_GET[‘acc’])) {

$criteria->with=array(‘journalDetail’); //disini relasi dibuat

$criteria->group=‘t.id, module_id, input_date, yearmonth_periode, system_ref, state_id’; //hasil relasi dibuat group by

$criteria->join=‘INNER JOIN u_journal_detail tt ON t.id = tt.parent_id’; //koneksi antara journal master ke journal detail

$criteria->compare(‘tt.account_no_id’,$_GET[‘acc’]); //disini filternya dibuat

}

$dataProvider=new CActiveDataProvider(‘uJournal’, array(

‘criteria’=>$criteria,

));

$this->render(‘index’,array(

‘dataProvider’=>$dataProvider,

));

}


Alhasil, sekarang saya dapat memfilter Jurnal mana saja (dari tabel master) yang Detailnya mengandung field Akun Kas Besar… semoga bermanfaat buat yang lain…

---- tambahan ini tidak ada di postingan di FB)

Jangan lupa memasukkan Relasi Tabel master ke Tabel Detail dengan Relasi ONE TO MANY (HAS_MANY)

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(


		'journalCount' => array(self::STAT, 'uJournalDetail', 'parent_id'),


		'journalSum' => array(self::STAT, 'uJournalDetail', 'parent_id','select'=>'sum(debit)'),	


		'journalDetail' => array(self::HAS_MANY, 'uJournalDetail', 'parent_id'),	


		//'status' => array(self::HAS_ONE, 'sParameter', null,'t.state_id = code AND condition'=>'type = "cStatus"'),	


	);


}

indentasi kodenya mbok ya dibenerin dulu bro Peter…

Haha… maaf agan Petra… pake sintaks highlight yah… lali…

itu udah dikasih


$criteria->with 

napa masih dikasih


$criteria->join 

juga mas?

hemm… good question…saya sudah coba ilangin karena saya pikir ngapain juga jadi double. tapi… query-nya somehow gagal bro… saya memang masih berpikir keras, jangan2 ada tehnik lain yang lebih baik… Saya lagi pelajari ulang tehnik AR, di link berikut ini:

http://www.yiiframework.com/doc/guide/1.1/en/database.arr#performing-relational-query-without-getting-related-models

saya memang berpikir ada yang miss mungkin… tapi itulah proses pembelajaran, tidak ada coding yang salah sepanjang coding itu berfungsi, tapi selalu ada coding yang lebih baik…