Menampilkan Data dari Tabel Berelasi tak Langsung

Misal saya punya database dengan sebagian ER sbb:




A       <--         B        -->      C

id_A (PK)         id_B (PK)         id_C (PK)

                  id_A (FK)         attribut1

                  id_C (FK)



bagaimana mengambil nilai atribut1 model C dari model A?

Saya baru dapat dengan menggunakan method findByAttributes sbb:

/model/A.php:




...

public function relations()

{

	return array(

		'namaRelasiKeB'=>array(self::HAS_MANY, 'B', 'id_A'),

	);

}

...



/controllers/AController.php:




...

private $_model;

...

//misal attribut1 C ingin dikeluarkan pada actionShow

public function actionShow()

{

	$a = $this->loadA();

	$this->render(

		'show',

		array(

			'model'=>$a,

			'bs'=>$a->namaRelasiKeB,

		)

	);

}

...

public function loadA($id=null)

{

	if($this->_model===null)

	{

		if($id!==null || isset($_GET['id']))

			$this->_model=A::model()->findbyPk($id!==null ? $id : $_GET['id']);

		if($this->_model===null)

			throw new CHttpException(404,'The requested page does not exist.');

	}

	return $this->_model;

}

...



/views/A/show.php:




<?php IF (!empty($bs)): ?>

<?php foreach ($bs as $ <img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='B)' /> : ?>

	Attribut1 = <?php echo C::model()->findByAttributes(array('id_C'=>$b->id_C))->attribut1;?></td>

<?php endforeach;?>

<?php else:?>

	Tidak ada data yang berelasi.

<?php endif;?>



Jika rekan ada solusi yang lebih efisien, misalnya mendefinisikannya dalam relations dalam class A, mohon pertimbangannya. Terima kasih sebelumnya. :lol:

klo seperti ini gmn??

model/A.php:




.....

public funtion relations(){

         return array (

             'namaRelasiKeC'=>array(self::MANY_MANY, 'C', 'B(A_id, C_id)'),

         );

}



controllers/AController.php:




public function actionShow()

{

        $a = $this->loadA();

        $this->render(

                'show',

                array(

                        'model'=>$a,

                )

        );

}

...

public function loadA($id=null)

{

        if($this->_model===null)

        {

                if($id!==null || isset($_GET['id']))

                        $this->_model=A::model()->with("namaRelasiKeC")->findbyPk($id!==null ? $id : $_GET['id']);

                if($this->_model===null)

                        throw new CHttpException(404,'The requested page does not exist.');

        }

        return $this->_model;

}




/views/A/show.php:




<?php IF (!empty($model->namaRelasiKeC)): ?>

<?php foreach ($model->namaRelasiKeC as $C) : ?>

        Attribut1 = <?php echo $C->attribut1;?>

<?php endforeach;?>

<?php else:?>

        Tidak ada data yang berelasi.

<?php endif;?>



mudah-mudahan yang saya tulis diatas benar…

belum dicoba soalnya ::)

ha itu dia yang saya maksud… Makasih Bang Suhanda!

klo misalnya saya pengen nampilin data A dan C dari tabel B, gimana ya?

Gygie

Pada umumnya, langkah menampilkan data dengan CActiveRecord sbb:

[list=1]

[*]set Relations pada model.

/models/B.php




<?php

class B extends CActiveRecord

{

...

        public function relations()

	{

		return array(

			'relKeA'=>array(

				self::BELONGS_TO,'A','fKeyA',

				'joinType'=>'INNER JOIN',

			),			

			'relKeC'=>array(

				self::BELONGS_TO,'C','fKeyC',

				'joinType'=>'INNER JOIN',

			),

		);

	}

...

}

?>



[*]panggil ActiveRecord dari Controller

/controllers/BController.php




<?php

class BController  extends CController

{

...

        public function actionShow()

	{

		//panggil model B dari behavior loadB() yang sudah ada dalam controller

		$modelB = $this->loadB();

		//atau bisa juga dengan langsung memanggil modelnya.

		//$modelB = B::model()->findAll($category);


		//render view Show

		$this->render('show',array('dataModelB'=>$modelB));

	}

...

}

?>



[*]tampilkan dari view

/views/B/show.php




...

	<?php IF (!empty($dataModelB)): ?>

		<?php foreach ($dataModelB as $<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='B)' /> : ?>

			id_A Tabel A = <?php echo $b->relKeA->id_A;?>

			Attribut1 Tabel C = <?php echo $b->relKeC->attribut1;?>

		<?php endforeach;?>

	<?php else:?>

        	Tidak ada data yang berelasi.

	<?php endif;?>

...



[/list]

Semoga membantu. :D

Apakah cara di atas dapat diterapkan pada kasus saya?

Kasus saya:

Saya mempunyai 2 tabel yaitu tabel news dan news_category, detilnya sbb:

news

id

title

content

category_id

news_category

id

category

Saya ingin menampilkan semua category pada saat posting news dengan menggunakan dropdown list. Nama model dan controller saya sama dg nama tabel.

Terima kasih.

mm, sepertinya untuk mengambil data dari tabel juga bisa direct misal

seperti kasusnya Mas, menampilkan kategori pada dropdown dukup dengan nama_model::model()->findAll()

_form.php untuk posting news:


...

<?php 

  echo $form->dropDownList(

    $news,

    'category_id', 

    news_category::model()->findAll() //ambil data langsung dari tabel

  ); 

?>

...

coba deh, soalnya ana sendiri belum nyoba sih… :P

kalau, mengenai relasi, mungkin pas kalau kita ingin menampilan "news ini masuk kategori apa sih…?"

sehingga relasinya kurang lebih sebagai berikut:


return array(

  'kategori'=>array(self::BELONGS_TO,'news_category','category_id'),

);

untuk menampilkan kategori pada halaman view news kurang lebih langkahnya seperti postingan di atas.


<?php echo $news->kategori->category;?>

Terima kasih mas nasrul, sudah saya coba dan bisa… kalo tanya tentang kolom layout Yii di mana ya?, soalnya saya ingin membagi website dalam 3 kolom.

Klo layout ada di dalam folder protected/layouts. Itu nanti tinggal buat satu file layout (.php) dan menggunakan CSS untuk membuatnya jadi tiga kolom. Klo misalnya pake CRUD dari Gii itu udah ada contoh codingan bikin layout-nya.




.....

public funtion relations(){

         return array (

             'namaRelasiKeC'=>array(self::MANY_MANY, 'C', 'B(A_id, C_id)'),

         );

}



Newbie mau ikutan nanya… di bagian belakang itu tertulis B(A_id, C_id) itu maksudnya gimana yah? Soalnya selama ini saya cuman pernah lihat satu field saja… Belum pernah lihat coding itu, jadi kurang memahami codingnya…

hubungan MANY_MANY biasanya dihubungkan oleh satu tabel yang merujuk sebagai ForeignKey bagi 2 tabel lainnya.

lihat skema relasinya:




A       <--         B        -->      C

id_A (PK)         id_B (PK)         id_C (PK)

                  id_A (FK)         attribut1

                  id_C (FK)



deklarasi relasi namaRelasiKeC di atas adalah relasi A ke C.

sedangkan B(A_id, C_id) adalah kombinasi ForignKey dari A ke C melalui B.

wallaahu ta’ala a’laam

Ooow… mulai menangkap maksudnya. Terima kasih :)

bagaimana klo ingin menempatkan viewnya modul ke halaman layoutnya(ex: main.php). jadi begini, saya coba buat 1 modul dg nama blokym. didalam blokym ini terdapat 3 action(add, edit, index) kemudian pada viewnya ada 3 buah file(add.php,

edit.php, index.php).

nah bagaimana menampilkanny(indexnya aja) pada layout/main.php. jadi index.php dapat diakses semua user sedangkan add dan edit hanya admin yg bisa mengaksesnya. potongan kodenya seperti ini:

layout/main.php




..

<body>

    <div id="header">Yii Website</div>

    <div id="main-menu">Menu-menu</div>

    <div id="sidebar">

       blokym akan ditaruh disini..

    </div>


    <div id="content"><?php echo $content; ?></div>


   <div id="footer">Copyright..</div>

</body>

..



terima kasih

Kalo Permasalahan saya seperti ini bgmana caranya?




A       <--         B        -->      C         --> D

id_A (PK)         id_B (PK)         id_C (PK)      id_D (PK)

                  id_A (FK)         attribut1      Atribut2

                  id_C (FK)         id_D



Dari Model A , saya ingin mengambil atribut2 yg berada di Model D…

Ada Solusi?

model/A.php


<?php

..

public funtion relations(){

         return array (

             'namaRelasiKeC'=>array(self::MANY_MANY, 'C', 'B(id_A, id_C)'),

         );

}

...

?>

model/C.php


<?php

...

public funtion relations(){

         return array (

             'namaRelasiKeD'=>array(self::BELONGS_TO, 'D', 'id_D'),

         );

}

...

?>

view:


<?php

foreach (A::model()->findAll() as $dataA){

   foreach ($dataA->namaRelasiKeC->namaRelasiKeD as $dataD){

       echo $dataD->Atribut2;

   }

}

?>

belum nyoba sih, semoga berhasil, :rolleyes:

note:

Mantab bro …

Berarti utk simpulannya seberapa panjang relasi tidak langsung tidak masalah.

Hal ini dgn catatan sudah di inisialisasi di model




....

   foreach ($dataA->namaRelasiKeC->namaRelasiKeD as $dataD){

       echo $dataD->Atribut2;

...



Tinggal nanti view seperti ini

$dataA->namaRelasi1->namaRelasi2->namaRelasi3->namaRelasiXXX->Atribut…

tapi ada masalah, search dan sorting kok jadi disable??

Saya ga menemukan solusi seperti dsini…

Ada Solusi lain??

Terima kasih bang Nasrul