Yii Framework Active Record

alfa6661
- October 20, 2013
0 (0 votes)
Rate :
Active Record Implementasi Object Relational Mapping (ORM) pada Yii Framework

Active Record adalah M dalam arsitektur MVC, yang merupakan lapisan dari sistem yang bertanggung jawab untuk mewakili data bisnis dan logika. Active Record memfasilitasi penciptaan dan penggunaan obyek yang datanya memerlukan penyimpanan persisten ke database.

Active Record (AR) adalah gambaran dari sebuah sistem Object Relational Mapping (ORM). Setiap kelas AR mewakili tabel database yang atributnya diwakili oleh properti kelas AR, dan turunan AR mewakili baris pada tabel tersebut. Operasi umum CRUD diimplementasikan sebagai metode AR. Dengan Menggunakan ORM, sifat dan hubungan objek dalam sebuah aplikasi dapat dengan mudah disimpan dan diambil dari database tanpa menulis pernyataan SQL secara langsung dan dengan kurang keseluruhan kode akses database. Hasilnya, kita dapat mengakses data dengan cara lebih terorientasi-objek.

Active Record sebagai Kerangka ORM

  • Mewakili model dan data
  • Mewakili asosiasi antara model ini
  • Mewakili hirarki warisan (inheritance) dengan model terkait
  • Melakukan validasi model sebelum ke database
  • Melakukan operasi database dalam mode berorientasi objek.

Mendefinisikan Kelas AR

Untuk mengakses tabel database, pertama kita perlu mendefinisikan kelas AR dengan mengextends class CActiveRecord. Setiap kelas AR mewakili satu tabel database, dan instance AR mewakili sebuah record (baris) dalam tabel tersebut. Contoh berikut memperlihatkan kode minimal yang diperlukan untuk kelas AR yang mewakili tabel students.

class Student extends CActiveRecord
{
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }
 
    public function tableName()
    {
        return 'students';
    }
}

Membuat Record

Untuk melakukan insert baris baru ke dalam tabel database, kita membuat instance baru dari kelas AR terkait, mengatur nilai propertinya yang berkaitan dengan kolom tabel, dan memanggil metode save() untuk menyelesaikan proses insert.

Sebagai contoh, kita dapat menggunakan kode berikut untuk menyisipkan baris baru ke dalam tabel students:

$student=new Student;
$student->nrp='6309189';
$student->name='Alfa Adhitya Arifin';
$student->save();

Membaca Record

Untuk membaca data dalam tabel database, kita dapat memanggil salah satu metode find seperti berikut.

// cari baris pertama sesuai dengan kondisi yang ditetapkan
$student=Student::model()->find($condition,$params);
// contoh
$student=Student::model()->find('nrp=:nrp', array(':nrp' => '6309189'));

// cari baris dengan primary key yang ditetapkan
$student=Student::model()->findByPk($student_nrp,$condition,$params);
// contoh
$student=Student::model()->findByPk('6309189');
 
// cari baris dengan nilai atribut yang ditetapkan
$student=Student::model()->findByAttributes($attributes,$condition,$params);
// contoh
$student=Student::model()->findByAttributes(array('nrp' => '6309189'));
 
// cari baris pertama menggunakan pernyataan SQL yang ditetapkan
$student=Student::model()->findBySql($sql,$params);
// contoh
$student=Student::model()->findBySql("SELECT * FROM students");

Dalam contoh di atas, kita memanggil metode find dengan Student::model(). Ingat bahwa metode statis model() diperlukan oleh setiap kelas AR. Metode ini menghasilkan instance AR yang dipakai untuk mengakses metode tingkat kelas (mirip dengan metode kelas static) dalam konteks obyek.

Jika metode find menemukan baris yang sesuai dengan kondisi query, ia akan mengembalikan turunan Student yang propertinya berisi nilai kolom terkait dari baris table. Kemudian kita dapat membaca nilai yang diambil seperti yang kita lakukan pada properti obyek, sebagai contoh, echo $student->name;.

Metode find akan menghasilkan null jika tidak ada yang ditemukan dalam database dengan kondisi query yang diberikan.

Ketika memanggil find, kita menggunakan $condition dan $params untuk menetapkan kondisi query. Di sini, $condition dapat berupa string yang mewakili klausa WHERE dalam pernyataan SQL, dan $params adalah array parameter yang nilainya akan di berikan dalam $condition. Sebagai contoh,

// cari baris dengan nrp=6309189
$student = Student::model()->find('nrp = ?', array('6309189'));

Ketika lebih dari satu baris data memenuhi kondisi query yang ditetapkan, kita dapat mengambilnya sekaligus menggunakan metode findAll, masing-masing memiliki pasangan metode find, seperti yang sudah di jelaskan sebelumnya.

// cari seluruh baris yang sesuai dengan kondisi yang ditetapkan
$students = Student::model()->findAll($condition,$params);
 
// cari seluruh baris dengan primary key yang ditetapkan
$students = Student::model()->findAllByPk($student_nrp,$condition,$params);
 
// cari seluruh baris dengan nilai atribut yang ditetapkan
$students = Student::model()->findAllByAttributes($attributes,$condition,$params);
 
// cari seluruh baris dengan pernyataan SQL yang ditetapkan
$students = Student::model()->findAllBySql($sql,$params);

Jika tidak ada yang sama dengan kondisi query, findAll akan mengembalikan array kosong. Ini berbeda dengan find yang akan mengembalikan null jika tidak menemukan apapun. Method findAll akan mengembalikan nilai berupa array, sehingga untuk menampilkan datanya memerlukan looping.

foreach ($students as $student) {
	echo "Code {$student->nrp}, Name {$student->name}";
}

Mengupdate Record

Setelah instance AR diisi dengan nilai kolom, kita dapat mengubah dan menyimpannya kembali ke tabel database.

$student = Student::model()->findByPk('6309189');
$student->name='Alfa Adhitya Arifin';
$student->save(); // simpan perubahan ke database

Seperti yang kita lihat, kita menggunakan metode save() yang sama untuk melakukan operasi insert maupun update. Jika instance AR dibuat menggunakan operator new, pemanggilan save() akan menyisipkan baris record baru ke dalam tabel database; jika turunan AR adalah hasil dari beberapa pemanggilan metode find atau findAll, memanggil save() akan mengupdate baris yang sudah ada dalam tabel.

Menghapus Record

Kita juga bisa menghapus baris data jika turunan AR sudah diisi dengan baris ini.

$student = Student::model()->findByPk('6309189'); // asumsi ada student dengan nrp 6309189
$student->delete(); // hapus baris dari tabel database

Metode berikut disediakan untuk menghapus baris tanpa harus mengambilnya lebih dulu (find):

// hapus baris yang sesuai dengan kondisi yang ditetapkan
Student::model()->deleteAll($condition,$params);
 
// hapus baris yang sesuai dengan kondisi dan primary key yang ditetapkan
Student::model()->deleteByPk($pk,$condition,$params);

Method Method pada Active Record

Method Keterangan
Single Row
$result=Student::model()->find(); Mengembalikan row pertama berdasarkan kondisi
$result=Student::model()->findByPk(); Mengembalikan row pertama yang memiliki primary key berdasarkan kondisi
$result=Student::model()->findByAttributes(); Mengembalikan row pertama yang memiliki attribut berdasarkan kondisi
$result=Student::model()->findBySql(); Mengembalikan row pertama berdasarkan kondisi SQL
Multipe Rows
$result=Student::model()->findAll(); Mengembalikan semua row berdasarkan kondisi
$result=Student::model()->findAllByPk(); Mengembalikan semua row yang memiliki primary key berdasarkan kondisi
$result=Student::model()->findAllByAttributes(); Mengembalikan semua row yang memiliki attribut berdasarkan kondisi
$result=Student::model()->findAllBySql(); Mengembalikan semua row berdasarkan kondisi SQL
INFORMATION
$jumlah= Student::model()->count(); Mengembalikan jumlah row berdasarkan kondisi
$jumlah= Student::model()->countBySql(); Mengembalikan jumlah row berdasarkan SQL
$jumlah= Student::model()->exists(); Memeriksa apakah terdapat row berdasarkan kondisi
Operation
Student::model()->updateAll(); Update berdasarkan kondisi
Student::model()->updateByPk(); Update dengan primarykey
Student::model()->deleteAll(); Delete berdasarkan kondisi
Student::model()->deleteByPk(); Delete berdasarkan primary key

Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter

– Eric S. Raymond

Have a better explanation?

If you have comments about this post. Please write your comments below

No comments associated with this article