AR Join 2 table

Hi bro bro yg sakti, mohon bantuannya…

Sekarang gw punya table Contant ( id PK, userid FK, recpntid FK) dengan relasi BELONGS TO ke table User (id PK), jadi relasinya itu Contact(userid) FK ke User(id), dan 1 lagi Contact(recpntid) ke User(id). Info tambahan di dalam User gw ada username dan fullname. Nah pertanyaan gw adalah bagaimanakan gw ambil dari model Contact atau Contact::model(), gw bisa mendapatkan Username atau Fullname (yang mengandung chunk kata <<CARI>>) tadi.

analoginya :

di Contact ada Userid 1, dia itu mempunyai nilai-nilai recpntid 2, 3, 4, 5, 6 (pastinya selain dia sendiri). Nah dari recpntid itu gw mau dapatin Username atau Fullname yang mengandung kata <<CARI>>.

jadi di dalam modelnya gw design

User

{

public function relations ()


{


    return array (


        'Contacts' =&gt; array ( self::HAS_MANY, 'Contact', 'userid' ),


    );


}

}

Contact

{

public function relations ()


{


    return array (


        'User' =&gt; array ( self::BELONGS_TO, 'User', 'userid' ),


    );


}

}

[size="4"][font="Trebuchet MS"]Thanks ya bro atas bantuannya[/font][/size]

semoga ini bisa membantu: http://goo.gl/dEQy

Tiga langkah utama:

  1. set relation

/models/Contact.php


class Contact extends CActiveRecords

{

    public function relations ()

    {

    return array (

       'User' => array ( self::BELONGS_TO, 'User', 'userid' ,'joinType' => 'INNER JOIN'),     //untuk memastikan tabel berelasi langsung gunakan INNER JOIN.

       'Rcptn' => array ( self::BELONGS_TO, 'User', 'recpntid', 'joinType' => 'INNER JOIN'),  

    );

    }

}

  1. bangun action pada controller.

misal kita ingin menampilkan data pada action default: list.

/Controllers/ContactController.php


class ContactController axtends CController

{

...

   public function actionList()

   { 

        $criteria=new CDbCriteria;

        //asumsi nilai <<cari>> dikiri dari method $_GET

        $cari = $_GET['cari'];

        $criteria->params = array("cari"=>"%$cari%");

        $criteria->conditions = "user.nama like :cari OR Rcptn.nama like :cari";

      

	$pages=new CPagination(Contact::model()->with('user','Rcptn')->count($criteria));

	$pages->pageSize=self::PAGE_SIZE;

	$pages->applyLimit($criteria);


	$models=Contact::model()->with('user','Rcptn')->findAll($criteria);


	$this->render('list',array(

		'models'=>$models,

		'pages'=>$pages,

	));

   }

...

}

  1. view it

/views/Contact/list.php




...

<?php $this->widget('CLinkPager',array('pages'=>$pages)); ?>


<?php foreach($models as $n=>$model): ?>

<div class="item">

ID: <?php echo CHtml::link($model->id,array('show','id'=>$model->id)); ?>

<br/>

USER: <?php echo CHtml::encode($model->User->nama); ?>

<br/>

RCPTN: <?php echo CHtml::encode($model->Rcptn->nama); ?>

<br/>


</div>

<?php endforeach; ?>

<br/>

<?php $this->widget('CLinkPager',array('pages'=>$pages)); ?>


...



yang peru diperhatikan pada pembuatan view: nama model dan attribut adalah Case-Sensitive.

belum nyoba siy, semoga saja membantu.