Codeigniter Model

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.

Konsep MVC

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 mengukuti 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 query SELECT.
  • $this->db->update() untuk update data di tabel;
  • $this->db->delete() untuk menghapus data di tabel;
  • $this->db->get_where() untuk mengambil data dengan WHERE;

Selain method-method ini, masih banyak lagi method lain yang disediakan Query Builder untuk membuat query database.

Selengkapnya kamu bisa baca di Dokumentasi Query Builder.

5. Apa yang tidak boleh dilakuakn 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 ditest dengan unit test.

🧑‍💻 Latihan: Menggunakan Model

Baiklah, sekarang mari kita latihan menggunakan model.

Tapi sebelum itu, lakukan ini:

1. Membuat Database

Silahkan buat dulu database di PHPmyadmin. Buatlah database dengan nama beritacoding.

membuat database

Setelah itu buatlah tabel dengan name article dengan struktur sebagai berikut:

create table article

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:

perintah sql untuk membuat tabel

Setelah itu klik Kirim.

Database dan tabel sudah selesai, berikutnya kita lakukan konfigurasi di Codeigniter agar bisa terhubung dengan database.

2. Konfigurasi Database

Pertama, silahkan 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 databasenya:

Bukalah file config/database.php kemudian ubah konfigurasi databasenya 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 passwordnya kosong.

Tapi jika kamu sudah pernah mengubah username dan password, silahkan diisi dengan usernmae 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 databasenya sudah benar.

Tapi kalau error seperti ini:

database error

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_publihed($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_publihed();

    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:

Tampilan artikel kosong

Sekarang coba tambahkan data di tabel article melalui Phpmyadmin.

insert data ke tabel

Silahkan isi data artikel yang akan ditambahkan dan jangan lupa berikan nilai false untuk kolom draft.

insert record

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:

view list artikel

Coba klik link artikel tersebut, maka kita akan membuka halaman show artikel.

view 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, silahkan 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:

hasil css untuk view show article

Terlihat lebih bagus 👍

Silahkan tambahkan juga CSS sesukamu untuk tampilan yang lain. Karena pada tutorial ini, kita tidak fokus pada CSS, melainkan pada konsep Codeigntier.

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:

tabel feedback

Berikutnya, kita akan membuat Model untuk tabel feedback.

2. Membuat Model Feedback

Silahkan 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 silahkan 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/.

halaman contact

Kemudian cobalah isi form tersebut dan kirim.

isi form contact

Jika tampil view Thanks berarti berhasil disimpan.

feedback form success

Untuk memastikan, apakah benar berhasil disimpan atau tidak..

..coba buka tabel feedback di Phpmyadmin.

data di tabel feedback

Apa Selanjutnya?

Kita sudah belajar tentang model dan berhasil melakukan view dan insert data dengan Model.

Namun, yang belum kita coba adalah update dan delete data. Ini akan kita pelajari di tutorial berikutnya.

Yakni:

Jika ada yang ditanyakan, silahkan sampaikan di kolom komentar.

Oh iya, Source code tutorial ini bisa kamu download di Github.

[🎁 Download Source Code]