Tutorial Codeigniter #06: Menggunakan Model dan Database
Setelah kita belajar tentang Controller dan View, berikutnya kita akan belajar tentang Model dan database.
Pada tutorial ini kita akan belajar tentang:
- Apa itu Model?
- Bagaimana cara menulis model yang benar?
- dan latihan menggunakan model untuk menampilkan dan insert data.
Mari kita mulai..
Apa itu Model?
Model adalah kode yang bertugas untuk membuat pemodelan data. Kadang juga dipakai untuk pemodelan logika bisnis.
Model bisa mengakses data dari Database dan juga sumber lainnya. Seperti API pihak ketiga.
Intinya:
Kalau berkaitan tentang data, itu tugasnya model.
Cara Membuat Model dan Aturannya
Model dapat kita buat di dalam folder models
, aturan penulisan model hampir sama dengan controller.
1. Penulisan Nama File
Nama file model harus menggunakan huruf besar atau kapital di awal dan jika terdiri dari dua suku kata atau lebih, bisa dipisah dengan underscore.
Contoh:
📜 Arcticle_model.php
📜 Product_model.php
📜 Account_model.php
Penamaan file model dengan akhiran _model
boleh dilakukan boleh juga tidak, tujuan memberikan akhiran _model
adalah untuk menghindari bentrok dengan nama Controller.
2. Penulisan Nama Class
Class model harus melakukan extends dari class CI_Model
.
Nama class mengikuti nama file, yakni diawali dengan huruf besar dan boleh dipisah dengan underscore.
Contoh:
<?php
class Product_model extends CI_Model
{
}
3. Penulisan Nama Method
Nama method diawali dengan huruf kecil dan jika terdiri dari dua suku kata, boleh dipisah dengan underscore.
Contoh:
<?php
class Product_model extends CI_Model
{
public function find()
{
}
public function get_expired_product()
{
}
}
4. Apa yang ditulis di dalam Model?
Di dalam model, kita harus menulis query untuk mengambil data di database dan mengembalikan hasil query berupa data. Nilai kembalian boleh berupa array maupun objek.
Contoh:
<?php
class Product_model extends CI_Model
{
public function find()
{
$query = $this->db->get_where('table_name', ['id' => $id]);
return $query->row(); // return berupa satu object
}
public function get_expired_product()
{
$query = $this->db->query("SELECT * FROM table WHERE expired=1");
return $query->result(); // return berupa array objek
}
}
Selain itu, ada juga yang menulis logika bisnis di dalam model.
Contohnya:
<?php
class Account_model extends CI_Model
{
public function deposit($deposit_count, $id)
{
$current_balance = $this->db->get_where('balance', ['id' => $id]);
$new_balance = $current_balance + $deposit_count;
$this->db->update($new_balance, ['id' => $id]);
}
public function withdraw($wd_count, $id)
{
$current_balance = $this->db->get_where('balance', ['id' => $id]);
$new_balance = $current_balance - $wd_count;
$this->db->update($new_balance, ['id' => $id]);
}
}
Pada contoh ini model menerima input dari argumen yang diberikan melalui method seperti $deposit_count
, $wd_count
, dan $id
.
Lalu di simpan dengan query update()
.
Dari mana asalnya query update()
?
Query ini berasal dari library Query Builder di Codeigniter.
Apa itu Query Build?
Query Builder adalah class yang berisi method untuk membuat query database.
Contoh:
$this->db->insert()
untuk menambahkan data ke tabel;$this->db->get()
untuk mengambil data dari tabel, sama seperti querySELECT
.$this->db->update()
untuk update data di tabel;$this->db->delete()
untuk menghapus data di tabel;$this->db->get_where()
untuk mengambil data denganWHERE
;
Selain method-method ini, masih banyak lagi method lain yang disediakan Query Builder untuk membuat query database.
Selengkapnya kamu bisa baca di Dokumentasi Query Builde.
5. Apa yang tidak boleh dilakukan di Model?
Jika kamu sudah tahu tugas model, tentunya juga tau apa yang tidak boleh dilakukan di model.
Misalnya seperti:
- Melakukan load view di dalam model 🤦♂️;
- Mengambil alih tugas Controller seperti mengakses fungsi
$this->input
dan$this->output
di dalam model;
Hal-hal tersebut, bisa dilakukan di dalam model. Tapi sangat disarankan agar tidak melakukannya.
Karena nanti akan mengakibatkan model jadi berantakan dan sulit dites dengan unit test.
🧑💻 Latihan: Menggunakan Model
Baiklah, sekarang mari kita latihan menggunakan model.
Tapi sebelum itu, lakukan ini:
1. Membuat Database
Silakan buat dulu database di PHPmyadmin. Buatlah database dengan nama beritacoding
.
Setelah itu buatlah tabel dengan name article
dengan struktur sebagai berikut:
Atau biar cepat gunakan perintah SQL berikut:
CREATE TABLE `beritacoding`.`article` (
`id` VARCHAR(32) NOT NULL ,
`title` VARCHAR(128) NULL ,
`slug` VARCHAR(128) NOT NULL ,
`content` TEXT NULL ,
`draft` ENUM('true','false') NOT NULL DEFAULT 'true' ,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ,
PRIMARY KEY (`id`)
) ENGINE = InnoDB;
Ketik perintahnya di menu SQL:
Setelah itu klik Kirim.
Database dan tabel sudah selesai, berikutnya kita lakukan konfigurasi di Codeigniter agar bisa terhubung dengan database.
2. Konfigurasi Database
Pertama, silakan lakukan autoload library database.
Caranya:
Buka file config/autoload.php
, kemudian pada bagian $autoload['libraries']
isi nilainya seperti ini:
$autoload['libraries'] = array('database');
Setelah itu lakukan konfigurasi database-nya:
Bukalah file config/database.php
kemudian ubah konfigurasi database-nya menjadi seperti ini:
$db['default'] = array(
'dsn' => '',
'hostname' => 'localhost',
'username' => 'root',
'password' => '',
'database' => 'beritacoding',
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => FALSE,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE
);
Perhatikan, hostame
diisi dengan localhost
karena kita akan menggunakan server database dari XAMPP atau di localhost.
Untuk usernem
kita isi pakai root
, karena default username database di XAMPP adalah root
dan password-nya kosong.
Tapi jika kamu sudah pernah mengubah username dan password, silakan diisi dengan username dan password tersebut.
Terakhir, kita mengisi database
yang merupakan nama database yang akan digunakan.
Nah, sekarang coba buka kembali aplikasinya dari localhost/beritacoding/
, kalau tidak ada yang error berarti konfigurasi database-nya sudah benar.
Tapi kalau error seperti ini:
Artinya konfigurasinya belum benar.
Pada error di atas, dapat kita ketahui penyebabnya karena:
Access denied for user 'root'@'localhost'
Yang artinya username root
tidak bisa dipakai pada server yang digunakan. Cobalah untuk mengubahnya dengan user yang valid.
3. Membuat Model Article
Buatlah file baru di dalam folder application/models
dengan nama Article_model.php
.
Kemudian isi dengan kode berikut:
<?php
class Article_model extends CI_Model
{
private $_table = 'article';
public function get_published($limit = null, $offset = null)
{
if (!$limit && $offset) {
$query = $this->db->get_where($this->_table, ['draft' => 'false']);
} else {
$query = $this->db->get_where($this->_table, ['draft' => 'false'], $limit, $offset);
}
return $query->result();
}
public function find_by_slug($slug)
{
if (!$slug) {
return;
}
$query = $this->db->get_where($this->_table, ['slug' => $slug]);
return $query->row();
}
}
Untuk saat ini, Article_model
cuma kita gunakan untuk mengambil data dengan dua method:
get_published()
untuk mengambil semua artikel yang statusnya terbit (draft = false
). Parameter$limit
dan$offset
berfungsi untuk menentukan banyak data yang harus diambil. Ini memang belum kita butuhkan saat ini, tapi nanti kita akan pakai saat membuat pagination.find_by_slug()
untuk mengambil satu artikel dengan slug tertentu,
Nanti kita juga akan tambahkan method-method lain seperti insert()
, update()
, dan delete()
.
Sekarang kita lanjut dulu ke:
4. Menggunakan Model di Controller
Sekarang buka kembali controller Article
dan ubah kodenya menjadi seperti ini:
<?php
class Article extends CI_Controller
{
public function __construct()
{
parent::__construct();
$this->load->model('article_model');
}
public function index()
{
// ambil artikel yang statusnya bukan draft
$data['articles'] = $this->article_model->get_published();
if (count($data['articles']) > 0) {
// kirim data artikel ke view
$this->load->view('articles/list_article.php', $data);
} else {
// kalau gak ada artikel, tampilkan view ini
$this->load->view('articles/empty_article.php');
}
}
public function show($slug = null)
{
// jika gak ada slug di URL tampilkan 404
if (!$slug) {
show_404();
}
// ambil artikel dengan slug yang diberikan
$data['article'] = $this->article_model->find_by_slug($slug);
// jika artikel tidak ditemuakn di database tampilkan 404
if (!$data['article']) {
show_404();
}
// tampilkan artikel
$this->load->view('articles/show_article.php', $data);
}
}
Pada kode di atas kita menggunakan dua method, yakni:
index()
untuk menampilkan list artikel;- dan
show()
untuk menampilkan satu artikel dengan slug tertentu.
5. Menampilkan Data di View
Berikutnya, ubahlah kode view list_article.php
dan show_article.php
masing-masing menjadi seperti ini:
📜 view/articles/list_article.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('_partials/head.php'); ?>
</head>
<body>
<?php $this->load->view('_partials/navbar.php'); ?>
<h1>List Artikel</h1>
<ul>
<?php foreach ($articles as $article) : ?>
<li>
<a href="<?= site_url('article/'.$article->slug) ?>">
<?= $article->title ? html_escape($article->title) : "No Title" ?>
</a>
</li>
<?php endforeach ?>
</ul>
<?php $this->load->view('_partials/footer.php'); ?>
</body>
</html>
📜 views/articles/show_article.php
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('_partials/head.php'); ?>
</head>
<body>
<?php $this->load->view('_partials/navbar.php'); ?>
<article class="article">
<h1 class="post-title"><?= $article->title ? html_escape($article->title) : "No Title" ?></h1>
<div class="post-meta">
Published at <?= $article->created_at ?>
</div>
<div class="post-body">
<?= $article->content ?>
</div>
</article>
<?php $this->load->view('_partials/footer.php'); ?>
</body>
</html>
Coba perhatikan kode di atas, di sana kita menggunakan fungsi html_escape()
, fungsi ini bertujuan untuk mencegah XSS attack.
Kita juga menggunakan fungsi site_url()
untuk membuat link.
Sekarang semuanya view sudah siap, mari kita lanjut ke:
6. Membuat Route untuk Artikel
Pada Controller, kita menggunakan method show()
untuk menampilkan artikel.
Method ini nantinya akan bisa dibuka melalui:
index.php/article/show/contoh-slug-artikel
Nah, biar lebih enak dilihat.. kita tidak akan menggunakan /show/
.
Karena itu, kita harus membuat custom route.
Mari kita buat!
Bukalah file config/routes.php
.
Kemudian tambahkan kode berikut:
$route['article/(:any)'] = 'article/show/$1';
Dengan route ini, artikel akan bisa kita buka melalui URL:
index.php/arcicle/contoh-slug-artikel
Sekarang mari kita coba!
7. Percobaan
Cobalah buka halaman beritacoding/index.php/article
. Jika kita belum menambahkan artikel di tabel article
maka akan tampil seperti ini:
Sekarang coba tambahkan data di tabel article
melalui Phpmyadmin.
Silakan isi data artikel yang akan ditambahkan dan jangan lupa berikan nilai false
untuk kolom draft
.
Atau kalau mau cepat, bisa jalankan kode SQL berikut:
INSERT INTO `article` (`id`, `title`, `slug`, `content`, `draft`, `created_at`)
VALUES ('1', 'Hello World!', 'hello-world', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.', 'false', CURRENT_TIMESTAMP);
Nah sekarang kita punya satu artikel yang sudah terbit.
Coba lihat hasilnya di halaman list artikel:
Coba klik link artikel tersebut, maka kita akan membuka halaman show artikel.
Keren 😍..
Tampilan list artikel dan show artikelnya memang masih belum rapi karena kita belum berikan CSS untuk elemen ini.
Kalau mau ditambahkan CSS untuk tampilan show artikel, silakan tambahkan kode CSS berikut pada main.css
.
.article {
max-width: 740px;
margin: 4em auto;
padding: 0 2em;
}
.article .post-title {
font-weight: bolder;
font-family: sans;
}
.article .post-meta {
margin: 1em 0;
font-size: 0.8rem;
font-family: sans;
color: grey;
}
.article .post-body {
line-height: 1.6rem;
}
Maka hasilnya:
Terlihat lebih bagus 👍
Silakan tambahkan juga CSS sesukamu untuk tampilan yang lain. Karena pada tutorial ini, kita tidak fokus pada CSS, melainkan pada konsep Codeigniter.
Oke lanjut..
🧑💻 Latihan: Insert Data ke Model
Kita sudah berhasil menampilkan data yang didapatkan dari model ke View.
Nah, sekarang.. bagaimana caranya menyimpan data ke model?
Gampang!
Kita bisa manfaatkan query insert()
.
Mari kita coba..
1. Membuat Tabel Feedback
Buatlah tabel baru di dalam database beritacoding
dengan nama feedback
.
Biar cepat, gunakan perintah SQL berikut:
CREATE TABLE `beritacoding`.`feedback` (
`id` VARCHAR(32) NOT NULL ,
`name` VARCHAR(32) NOT NULL ,
`email` VARCHAR(32) NOT NULL ,
`message` TEXT NOT NULL ,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
PRIMARY KEY (`id`)
) ENGINE = InnoDB;
Sehingga sekarang kita punya tabel seperti ini:
Berikutnya, kita akan membuat Model untuk tabel feedback.
2. Membuat Model Feedback
Silakan buat file baru di dalam folder models
dengan nama Feedback_model.php
kemudian isi kodenya seperti ini:
<?php
class Feedback_model extends CI_Model
{
private $_table = "feedback";
public function insert($feedback)
{
if(!$feedback){
return;
}
return $this->db->insert($this->_table, $feedback);
}
}
Pada model ini kita menggunakan query insert()
untuk menambahkan data ke dalam tabel feedback
.
Berikutnya silakan lanjutkan ke:
3. Menggunakan Model pada Controller
Buka kembali Controller Page.php
, kemudian ubahlah isi method contact()
menjadi seperti ini:
public function contact()
{
$data['meta'] = [
'title' => 'Contact Us',
];
if ($this->input->method() === 'post') {
$this->load->model('feedback_model');
// @TODO: lakukan validasi di sini sebelum insert ke model
$feedback = [
'id' => uniqid('', true), // genearate id unik
'name' => $this->input->post('name'),
'email' => $this->input->post('email'),
'message' => $this->input->post('message')
];
$feedback_saved = $this->feedback_model->insert($feedback);
if ($feedback_saved) {
return $this->load->view('contact_thanks');
}
}
$this->load->view('contact', $data);
}
Coba perhatikan, di sana kita melakukan load view contact_thanks
, view ini belum kita buat.
Karena itu mari kita:
4. Membuat View untuk Thanks
Buatlah file baru di dalam folder views
dengan nama contact_thanks.php
dengan isi sebagai berikut:
<!DOCTYPE html>
<html lang="en">
<head>
<?php $this->load->view('_partials/head.php'); ?>
</head>
<body>
<?php $this->load->view('_partials/navbar.php'); ?>
<div class="container">
<h1>Thank You!</h1>
<p>Your message has been sent!</p>
</div>
<?php $this->load->view('_partials/footer.php'); ?>
</body>
</html>
View ini cuma bertugas untuk menampilkan pesan feedback saat berhasil mengirim data dari form contact.
Oke sekarang, mari kita coba..
4. Percobaan
Bukalah halaman beritacoding/index.php/page/contact/
.
Kemudian cobalah isi form tersebut dan kirim.
Jika tampil view Thanks berarti berhasil disimpan.
Untuk memastikan, apakah benar berhasil disimpan atau tidak..
..coba buka tabel feedback
di Phpmyadmin.
No comments:
Post a Comment