[Yii Framework] Mudah Memainkan Database Anda dengan Active Record

Pada Yii Framework dikenal Active Record yang digunakan untuk mempermudah aplikasi berinteraksi dengan database. Yii sendiri sudah cukup jelas memaparkan penggunaan active record pada Yii Framework disini. Tapi saya akan ulas kembali lebih detail beberapa hal terkait cara penggunaan Yii Framework sendiri pada sebuah aplikasi. Saya sendiri akan membahas beberapa active record yang sangat sering saya gunakan dalam pembuatan aplikasi, diantaranya sebagai berikut:

Misal saya memiliki sebuah database dengan tabel “biodata”. Tabel “biodata” sendiri memiliki attribute sebagai berikut:

  1. id : Primary Key, Integer, Auto Increment
  2. nama : varchar(100)
  3. alamat : text il
Tabel tersebut saya input data seperti berikut:
             |   id    |     nama         | alamat                    |
             |    1     |   Joko            | Palembang           |
             |    2    |    Ali                | Jakarta                  |
             |    3    |     Joko           | Papua                     |
             |     4    |   Mahmud    |  Palembang          |
             |     5    |   Ga tahu       | Ga tahu juga        |
  • FindByPk() : Digunakan untuk menemukan data yang memiliki Primary Key tertentu.
contoh penggunaan :
$itu=Biodata::model()->findByPk(2);

Code di atas akan mengembalikan sebuah nilai dari tabel biodata yang memiliki “id” 2. Untuk menampilkan hasil nya, anda dapat gunakan code seperti berikut:

echo $itu->id; (untuk menampilkan id nya)
echo $itu->nama; (untuk menampilkan nama nya)
echo $itu->alamat; (untuk menampilkan alamatnya)
  • FindByAttributes(): Digunakan untuk menemukan data yang memiliki attribute tertentu.
contoh penggunaan :
$itu=Biodata::model()->findByAttributes(array('nama'=>'Ali')); atau bisa juga
$itu=Biodata::model()->findByAttributes(array('nama'=>'Joko','alamat'=>'Palembang'));

Sedangkan tata cara untuk menampilkannya sama saja dengan yang digunakan pada ‘findByPk()’

 

  • FindAllByAttributes() : Digunakan untuk menemukan data yang memiliki attribute tertentu, tapi data yang di hasilkan lebih dari 1 row data.
contoh penggunaan :
$itu=Biodata::model()->findAllByAttributes(array('nama'=>'Joko'));

Dari code di atas, akan dihasilkan 2 buah row data. Yaitu data dengan ‘id’ 1 dan 3, itu karena kedua nya memiliki ‘nama’ Joko. Karena data yang dihasilkan lebih dari 1, maka cara menampilkannya pun harus 1 per 1. Berikut tata cara untuk menampilkan data nya:

foreach($itu as $i=>$ii)
{
      echo $ii->id;
      echo $ii->nama;
      echo $ii->alamat;
}

 

  • Menggunakan ‘scopes’
Penggunaan scopes digunakan saat kita membutuhkan sebuah query yang sama berulang-ulang pada suatu aplikasi. Hal ini dimaksud untuk mempermudah dan mempersingkat aktivitas coding kita😀. Contoh penggunaan :
    public function scopes()
    {
        return array(
            'panggilJoko'=>array(
                'condition'=>'nama=Joko',
                'limit'=>5,
            ),
        );
    }
Letakkan kode di atas pada “model” bersangkutan. Kode tersebut jika dipanggil akan menghasilkan semua data dengan nama “Joko” dimana maksimal yang di tampilkan adalah 5 buah data. Berikut contoh code untuk menggunakan fungsi tersebut dan menampilkan data yang dihasilkan dari fungsi tersebut :
$itu=Biodata::model()->panggilJoko()->findAll();
//berikut untuk menampilkan nya
foreach($itu as $i=>$ii)
{
      echo $ii->id;
      echo $ii->nama;
      echo $ii->alamat;
}
  • Menggunakan ‘scopes’ dengan parameter
Pada fungsi yang ada di atas, kita memanggil sebuh query yang sudah kita tetapkan kondisi nya. Misal ‘nama=Joko’, bagaimana bila kita ingin membuat banyak kondisi dimana nama nya bisa kita ubah-ubah setiap saat kita memanggil fungsi tersebut. Tentu kita harus mengubah fungsi tersebut menjadi dinamis dengan cara memberikan parameter pada fungsi tersebut. Berikut cara untuk menggunakannya:
Masukkan code berikut pada ‘model’ bersangkutan:
public function panggilSiapa($nama=Joko)
{
    $this->getDbCriteria()->mergeWith(array(
        'condition'=>'nama='.$nama,
        'limit'=>4,
    ));
    return $this;
}
Kode di atas akan mengembalikan semua data pada tabel biodata yang memiliki nama sesuai dengan kita mau. Tapi bila kita tidak mengisi parameter nama sesuai yang dimaksud, maka code tersebut akan menghasilkan data yang memiliki nama “Joko”(default nya adalah “Joko”). Berikut cara menggunakan fungsi tersebut beserta cara menampilkannya:
$itu=Biodata::model()->panggilSiapa()->findAll(); //mengembalikan semua data dengan nama Joko
$itu=Biodata::model()->panggilSiapa('Ali')->findAll();  //mengembalikan semua data dengan nama Ali

Sedangkan cara menampilkan data nya adalah sebagai berikut:

foreach($itu as $i=>$ii)
{
      echo $ii->id;
      echo $ii->nama;
      echo $ii->alamat;
}
Sebenarnya masih ada banyak Active Record yang tidak saya paparkan 1 per 1 disini, seperti findBySql,findAllBySql, dll.. Anda dapat menggali sendiri penggunaan lainnya. Tapi 1 hal yang perlu anda ingat,
Penggunaan Active Record lebih lambat dari menggunakan SQL query secara langsung ke database. Hal ini sudah dijelaskan langsung dari Yii Framework disini.
Jadi tentukan kebutuhan anda sendiri kapan anda harus menggunakannya atau tidak…
Selamat mencoba…
Semoga membantu….😀

17 Responses to [Yii Framework] Mudah Memainkan Database Anda dengan Active Record

  1. melengo says:

    gan . cara nampilin data berdasarkan level yang sudah di tentukan di database gimana gan . permisalan ane punyak tabel dengan nama USER kemudian ade kolom level dengan isi kolom operator,admin ama userbiasa. cara nampilin data berdasarkan level = operator ama admin mengunakan zii.widgets.grid.CGridView gi mana gan maklum masih new nih gan.

  2. mksd ny gmana gan? bisa di jelasin lebih detail lagi?

  3. Pandot says:

    halo gan,.. mau request dong, tutorial about pembuatan module di yii… hehe maklum masih nubie..

    thx.before.

  4. iya, gan kalo sempet saya coba nanti..

  5. pandot says:

    halo sabit, sebelumnya thq buat info2 sama tutor yii-nya yang sedikit banyak udah bantu TA gw kmrn hahaha.

    well, berhubung masih belajar juga ni soal yii, merhatiin TA gw kmrn dalam pembuatan modules buat beck-end, kalo gw perhatiin apakah bukannya ada duplikasi file disitu about file controller dan model?

    mungkin itu aja sih yang pengen di omongin sama ditanyain, sebelumnya thq buat tutor2nya.

  6. mksd nya duplikasi yang mana gan?

  7. cleo62 says:

    mau tanya nih.findbyattributes kalo tampilannya untuk tabel, syntaxnya gimana ya gan?

    • findbyattributes cuma akan mengembalikan 1 nilai aja gan, jadi percuma di tampilin di tabel..

      • cleo62 says:

        oh gitu ya..oke gan.kalo mau nampilin data dari tabel di CGridView tapi berdasarkan salah satu atribut tabelnya gimana?jadi misal ane punya tabel

        naskah –> user –> jabatan
        id_naskah (PK) id_user (PK) id_jabatan(PK)
        id_ pengirim (FK) id_jabatan (FK) nama jabatan
        perihal
        content

        id_pengirim itu FK dari id_user (namanya nggak sama)..nah yang ane mau tanyain :
        1. gimana nampilin data di CGridView naskah yang id_pengirimnya user yang sedang manggunakan aplikasi?
        2. gimana nampilin nama jabatan di CGridView naskah?

        maap gan kalo nanya banyak.maklum ane newbie pake banget.thx before

      • di blog ini ada tutor untuk menampilkan data yang berelasi, ada juga untuk memfilter dari relasi tabel nya.. coba dicari aja mas..

  8. oby says:

    halo mas,
    mau tanya

    pas, saya mau hapus kategori (posisi sebagai admin)
    muncul pesan kayak gini :

    CDbCommand failed to execute the SQL statement: SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`forum`.`thread`, CONSTRAINT `thread_ibfk_4` FOREIGN KEY (`kategori_id`) REFERENCES `kategori` (`id`) ON UPDATE CASCADE). The SQL statement executed was: DELETE FROM `kategori` WHERE `kategori`.`id`=1

    C:\xampp\htdocs\yii\framework\db\CDbCommand.php(358)

    346 {
    347 if($this->_connection->enableProfiling)
    348 Yii::endProfile(‘system.db.CDbCommand.execute(‘.$this->getText().$par.’)’,’system.db.CDbCommand.execute’);
    349
    350 $errorInfo=$e instanceof PDOException ? $e->errorInfo : null;
    351 $message=$e->getMessage();
    352 Yii::log(Yii::t(‘yii’,’CDbCommand::execute() failed: {error}. The SQL statement executed was: {sql}.’,
    353 array(‘{error}’=>$message, ‘{sql}’=>$this->getText().$par)),CLogger::LEVEL_ERROR,’system.db.CDbCommand’);
    354
    355 if(YII_DEBUG)
    356 $message.=’. The SQL statement executed was: ‘.$this->getText().$par;
    357
    358 throw new CDbException(Yii::t(‘yii’,’CDbCommand failed to execute the SQL statement: {error}’,
    359 array(‘{error}’=>$message)),(int)$e->getCode(),$errorInfo);
    360 }
    361 }
    362
    363 /**
    364 * Executes the SQL statement and returns query result.
    365 * This method is for executing an SQL query that returns result set.
    366 * @param array $params input parameters (name=>value) for the SQL execution. This is an alternative
    367 * to {@link bindParam} and {@link bindValue}. If you have multiple input parameters, passing
    368 * them in this way can improve the performance. Note that if you pass parameters in this way,
    369 * you cannot bind parameters or values using {@link bindParam} or {@link bindValue}, and vice versa.
    370 * Please also note that all values are treated as strings in this case, if you need them to be handled as

    # itu kenapa yaa ?
    terima kasih

  9. Andika says:

    Gan, saya baru belajar yii.
    Cara menampilkan record dari table berbeda dengan controller yang tidak ber-relasi bagaimana?
    Saya lihat disitu bisa menggunakan findAll(), tapi saya tidak paham findAll-nya diletakkan dimana dan cara menampilkannya.

    Terima kasih.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: