Skip navigation


Salah satu masalah yang dihadapi oleh orang saat menggunakan Yii adalah mengambil atribut dari tabel kedua (ketiga, keempat, dst) yang digunakan pada saat JOIN.

Katakanlah saya mempunya dua buah tabel ModelA dan ModelB seperti di bawah.

CREATE TABLE IF NOT EXISTS `ModelA` (
  `id` int(11) NOT NULL,
  `attribute2` int(11) NOT NULL,
  `attribute3` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `ModelB` (
  `id` int(11) NOT NULL,
  `aId` int(11) NOT NULL,
  `attribute3` int(11) NOT NULL,
  `attribute4` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


Dapat langsung dilihat bahwa atribut aId di ModelB merupakan foreign key (meski dalam contoh ini tidak saya deklarasikan secara eksplisit menggunakan FOREIGN KEY) dari atribut id di ModelA. Dan saya menambahkan entrinya.

INSERT INTO `ModelA` (`id`, `attribute2`, `attribute3`) VALUES
(1, 1, 1),
(2, 2, 2);
INSERT INTO `ModelB` (`id`, `aId`, `attribute3`, `attribute4`) VALUES
(1, 1, 10, 100),
(2, 2, 20, 200),
(3, 1, 30, 300),
(4, 1, 40, 400);

Jadi, entri dengan ID 1 di ModelA direferensikan oleh 3 buah entri diModelB, sementara entri dengan ID 2 hanya direferensikan oleh 1 entri.

Kemudian saya membuat model class untuk ModelA seperti di bawah

class ModelA extends CActiveRecord {
    public $bAttribute3;
    public $bAttribute4;
    public static function model($className = __CLASS__) {
            return parent::model($className);
    }
}

Bisa dilihat ada atribut bAttribute3 dan bAttribute4 di kelas model tersebut. Pada atribut itu saya akan menyimpan attribute3 dan attribute4 milik tabel ModelB.

Kemudian di controller, saya menambahkan DataProvider

public function actionIndex(){
    $dataProvider = new CActiveDataProvider('ModelA', array(
        'criteria' => array(
            'select' => array(
                '`t`.*',
                '`b`.`attribute3` AS `bAttribute3`',
                '`b`.`attribute4` AS `bAttribute4`'
            ),
            'join' => 'JOIN `ModelB` AS `b` ON `b`.`aId` = `t`.`id`',
        )
    ));
    $this->render('index', array(
        'dataProvider' => $dataProvider,
    ));
}

Bsisa dilihat, pada bagian SELECT, saya mengubah nama attribute3 dan attribute4 dari ModelB menjadi bAttribute3 dan bAttribute4 agar bisa disimpan oleh atribut bAttribute3 dan bAttribute4 di ModelA.

Dan di view saya melakukan hal di bawah

$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'my-grid',
    'dataProvider' => $dataProvider,
    'columns' => array(
        'id',
        'attribute2',
        'attribute3',
        'bAttribute3',
        'bAttribute4',
    ),
));

Akhirnya, beginilah hasilnya🙂

4 Comments

  1. kalo lebih dari 2 tabel gimana joinnya om?

  2. Mantap om . . . Ditunggu tulisan lainnya😀

  3. Reblogged this on erycamel.

  4. datanya kok malah nggak mau muncul kenapa ya gan?


Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: