[*]Relasi tabel di Yii[*]

Maap kalo repost sebelumnya,

to de point aja yh kk kk semua :)

kalo mau menghubungkan field beda tabel itu gimana yh di yii… (table relasi)

misal ane punya table ( anggota dan provinsi)

anggota (1) ------------------- (n) provinsi

di tabel anggota itu isinya : id_anggota, nama, nomor_telpon, fk_id_prov

di tabel provinsi itu isinya : id_provinsi, nama_provinsi

ini di contoh view.php (anggota)




<?php

$this->breadcrumbs=array(

	'Anggota'=>array('index'),

	$model->idAnggota,

);


.

.

.

?>

<h1>View Anggota #<?php echo $model->id_province; ?></h1>


<tr class="odd">

		<th colspan="2">Data Anggota</th>

	</tr>

		<tr class="even">

			<th>Nama</td><td><?php echo $model->nama?></td>

		</tr>

		<tr class="even">

			<th>Telpon </td><td><?php echo $model->nomor_telepon?></td>

		</tr>	

		<tr class="even">

			<th>Provinsi</td><td><?php echo $model->fk_id_provinsi?></td> 

		</table>

.

.

.

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

	'data'=>$model,

	'attributes'=>array(),

)); ?>



sedang untuk tampilannya jadi

Nama : Andrew

Telpon: 123456

Provinsi : 1 O0

provinsi yng kepanggil itu id dari table provinsi…

nah kalo mau munculin nama provinsi sesuai id_prov gimana yh gan??

ane dah coba $model->provinsi->nama_provinsi

tapi ttp aja gagal :hammer:

ada masukan ga gan??

thnks before … :D

bikin function di model aja…

misal


public function getProvinsi($id)

		{

			$name=Provinsi::model()->find(array(

			'select'=>'name',

			'condition'=>'id_provinsi=:id',

			'params'=>array(':id'=>$id),

			));

			$name = $name->name;

			return $name;

		}

trus dipanggilnya :


echo NamaModel::model()->getProvinsi($model->fk_id_provinsi)

waahh… makasi banyak mas buat pencerahannya…

:D

Maaf bukannya sok tau, tapi sepertinya best practice untuk relasi di Yii adalah dengan membuat relasi di Model.

Contoh:




class Anggota extends CActiveRecord

{

  ...

  public function relations()

  {

    return array(

     'provinsi'=>array(self::BELONGS_TO,'Provinsi','fk_id_prov'),

   );

  }

  ...

}




class Provinsi extends CActiveRecord

{

  ...

  public function relations()

  {

    return array(

     'anggota'=>array(self::HAS_MANY,'Anggota','fk_id_prov'),

   );

  }

  ...

}

Contoh mengakses nama propinsi dari objek anggota:


$anggota->provinsi->nama_provinsi;

Mungkin ini dapat membantu: http://www.yiiframework.com/wiki/227/guidelines-for-good-schema-design/

pengalaman pribadi, kadang itu ga berhasil…

error trying to get property of non-object…

kayanya tergantung t4 penaruhan koding itu d(kalo ga q yg error kali :P )…

kalo solusi paling singkat q kaya gini…

baru inget setelah da posting diatas…


Provinsi::model()->findByPk($model->id_provinsi)->name

@nk913, @Angela Ari: thnks buat masukannya…

ane jadinya pake




Provinsi::model()->findByPK($model->id)->nama_provinsi



thnks yaa :D

ikutan saran aja,

dari pengalaman ane kalau data induk dan anak-nya

sama-sama banyak apalagi ada fungsi SUM(),COUNT(),AVG()

saran dari nk913 akan lebih lama tampil-nya di gridview

dibanding saran dari angela ari.

maaf gan ini pengalaman ane di PHP murni

dan framework lain gan.

sama ga ya di Yii ini, soalnya baru mengenal.

maaf mbak itu klo munculin data provinsinya semisal lebih dr 1 codenya bagaimana??

kalo ane sih gini gan :


'eMPPROVINCE.PROVINCE_NAME',

     |              |

     |              |

     V              V

'nama_relasi.field_target',

jadi lihat di model agan di bagian yang bersangkutan, cari di bagian public function relations() yang menunjukkan relasi tabel yang dibutuhkan. berikutnya di bagian view.php di baris detailview di bagian yang bersangkutan kasih format seperti yang di atas.

misal di tabel:

anggota

id_anggota

nama_anggota

id_province

province

id_province

nama_province

seteleah di relasikan kemudian di generate biasanya format relasi pada model anggota.php nya kurang lebih seperti ini :


public function relations()


	{

		return array(

			...

			'aNGGOTAPROVINCE' => array(self::BELONGS_TO, 'province', 'id_province'),

			...

		);

	}

model province.php


public function relations()

	{

	return array(

			'aNGGOTa' => array(self::HAS_MANY, 'anggota', 'id_province'),

		);

	}

jadi nanati di view.php anggota agan :


<?php $this->widget('bootstrap.widgets.TbDetailView',array(

	'data'=>$model,

	'attributes'=>array(

            ....

           'id_province'---> diubah menjadi 'aNGGOTAPROVINCE.name_province',

            ....

?>




kalau di _form.php


<?php echo $form->dropDownListRow($model,'anggota', CHtml::listData(PROVINCE::model()->findAll(), 'id_province','name_province'),array('empty'=>'----- Pilih Propinsi -----')); ?>

semoga membantu :)

kalo relasi tiga model kayak gini bagaimana gan ? 5196

2014-02-10_063715.jpg
…contoh ngakses jabatan dari naskah gimana

wah, @junior_yii, mending buka thread baru deh, jangan nebeng.

thread ini kan udah selese, kesimpulannya bisa pake AR relationship (@nk913) atau hardcode (@angela88, @sanu)

dua-duanya valid, ndak ada yg paling bener, yg paling salah.

Gunakan sesuai kebutuhan di lapangan, kalo untuk data propinsi doang, saya malah lebih suka pendekatan yg hardcode. Soalnya data propinsi kan "hampir" static, kalo dibikin AR relationship jadi beban join, ntar kayak kata @sanu, makin gede data anggotanya querynya jadi berat. Soalnya join itu cross product, misalnya ada 33 propinsi, lalu ada 10,000 anggota, proses join awalnya sebelum filter by foreign key akan menghasilkan 330,000 record. gak worth it kan?

Kalo yg ditanyain @junior_yii mungkin cocok pake pendekatan ini

solusi hardcode lainnya:

  1. propinsi diload sebagai listOptions, contoh

$listPropinsi = array(1=>'Aceh', 2=>'Banten', dst);

  1. langsung pake di viewnya (perlu antisipasi kalo2 id_province belum diisi):

<h1>View Anggota #<?php echo $listPropinsi[$model->id_province]; ?></h1>