Yii Framework Forum: Menampilkan Data dari Tabel Berelasi tak Langsung - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Menampilkan Data dari Tabel Berelasi tak Langsung Menngunakan Relational CActiveRecord Rate Topic: -----

#1 User is offline   nasrul 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 98
  • Joined: 14-April 09
  • Location:Sorowako - Indonesia

Posted 03 August 2009 - 08:29 AM

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?
0

#2 User is offline   nasrul 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 98
  • Joined: 14-April 09
  • Location:Sorowako - Indonesia

Posted 03 August 2009 - 10:11 AM

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 $ 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:
0

#3 User is offline   suhanda 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 11
  • Joined: 04-August 09
  • Location:Jakarta

Posted 04 August 2009 - 11:04 PM

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 ::)
1

#4 User is offline   nasrul 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 98
  • Joined: 14-April 09
  • Location:Sorowako - Indonesia

Posted 05 August 2009 - 02:46 AM

ha itu dia yang saya maksud... Makasih Bang Suhanda!
0

#5 User is offline   Gygie 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 1
  • Joined: 08-September 09

Posted 08 September 2009 - 03:38 AM

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


Gygie
0

#6 User is offline   nasrul 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 98
  • Joined: 14-April 09
  • Location:Sorowako - Indonesia

Posted 25 December 2009 - 08:14 PM

View PostGygie, on 08 September 2009 - 03:38 AM, said:

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


Gygie


Pada umumnya, langkah menampilkan data dengan CActiveRecord sbb:
  • 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 $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;?>
    ...
    


Semoga membantu. :D
1

#7 User is offline   __agus 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 166
  • Joined: 22-April 10
  • Location:Yogyakarta, Indonesia

Posted 17 May 2010 - 10:36 PM

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.
0

#8 User is offline   nasrul 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 98
  • Joined: 14-April 09
  • Location:Sorowako - Indonesia

Posted 06 June 2010 - 03:32 AM

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;?>

0

#9 User is offline   __agus 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 166
  • Joined: 22-April 10
  • Location:Yogyakarta, Indonesia

Posted 12 June 2010 - 06:16 AM

View Postnasrul, on 06 June 2010 - 03:32 AM, said:

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.
0

#10 User is offline   bhoo-day 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 14
  • Joined: 17-June 10

Posted 18 June 2010 - 01:17 AM

View Post__agus, on 12 June 2010 - 06:16 AM, said:

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.
0

#11 User is offline   junxiong 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 541
  • Joined: 21-June 10

Posted 24 June 2010 - 01:15 PM

.....
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...
“The most likely way for the world to be destroyed, most experts argue, is by accident. That’s where we come in; we’re computer professionals. We cause accidents.” - Nathaniel Borenstein

Yii Playground : Collaborative demo apps. You can join to improve it too!
My Team's Blog: In Indonesian.
0

#12 User is offline   nasrul 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 98
  • Joined: 14-April 09
  • Location:Sorowako - Indonesia

Posted 25 June 2010 - 04:42 AM

View Postjunxiong, on 24 June 2010 - 01:15 PM, said:

.....
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
0

#13 User is offline   junxiong 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 541
  • Joined: 21-June 10

Posted 28 June 2010 - 10:17 PM

Ooow.. mulai menangkap maksudnya. Terima kasih :)
“The most likely way for the world to be destroyed, most experts argue, is by accident. That’s where we come in; we’re computer professionals. We cause accidents.” - Nathaniel Borenstein

Yii Playground : Collaborative demo apps. You can join to improve it too!
My Team's Blog: In Indonesian.
0

#14 User is offline   __agus 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 166
  • Joined: 22-April 10
  • Location:Yogyakarta, Indonesia

Posted 01 July 2010 - 03:59 AM

View Postbhoo-day, on 18 June 2010 - 01:17 AM, said:

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.


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
0

#15 User is offline   ariefpriyadi 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 27
  • Joined: 08-June 10
  • Location:Kenjeran-Surabaya

Posted 30 August 2010 - 01:09 AM

View Postnasrul, on 05 August 2009 - 02:46 AM, said:

ha itu dia yang saya maksud... Makasih Bang Suhanda!

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?
arief.kenjeran.net
0

#16 User is offline   nasrul 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 98
  • Joined: 14-April 09
  • Location:Sorowako - Indonesia

Posted 30 August 2010 - 08:00 AM

View Postariefpriyadi, on 30 August 2010 - 01:09 AM, said:

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:

Quote

statement A::model()->findAll() dapat juga dipanggil dari action controller
$this->render('view',array('dataA'=>A::model()->findAll()));

0

#17 User is offline   ariefpriyadi 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 27
  • Joined: 08-June 10
  • Location:Kenjeran-Surabaya

Posted 01 September 2010 - 04:01 AM

View Postnasrul, on 30 August 2010 - 08:00 AM, said:

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
arief.kenjeran.net
0

#18 User is offline   donal 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 27
  • Joined: 12-October 10

Posted 28 October 2010 - 09:35 PM

View Postnasrul, on 25 December 2009 - 08:14 PM, said:

Pada umumnya, langkah menampilkan data dengan CActiveRecord sbb:
  • 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 $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;?>
    ...
    


Semoga membantu. :D

0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users