สร้างระบบ CRUD เพื่อศึกษาฟังก์ชั่นของ Model ใน CodeIgniter 4

บทความ เมื่อไม่กี่สัปดาห์ โดย Ninenik Narkdee
codeigniter crud codeigniter 4 database model

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ codeigniter crud codeigniter 4 database model



เนื้อหาตอนต่อไปนี้ เราจะมาลองทำระบบ CRUD ซึ่งเป็น
รุปแบบการ แสดงข้อมูล เพิ่ม ลบ และแก้ไขข้อมูล
ถ้าเรียงตามลำดับตัวอักษร ก็จะเป็น
    CREATE - เพิ่มข้อมูล
    READ - แสดงข้อมูล
    UPDATE - แก้ไขข้อมูล
    DELETE - ลบข้อมูล
 
    ซึ่งเป็นรูปแบบการทำงานเบื้องต้นของระบบจัดการทั่วไป ที่ใช้งานร่วมกับ
ฐานข้อมูล โดยในที่นี้เราจะปรับใช้จากเนื้อหาบทความตอนที่แล้ว เกี่ยวกับ
ตาราง news นำมาต่อยอดเพิ่มเติม พร้อมปรับหน้าตาให้ดูสวยงามขึ้นโดยใช้
bootstrap ทบทวนเนื้อหาตอนที่แล้วได้ที่
    สร้าง Dynamic Page เบื้องต้นใน CodeIgniter 4 http://niik.in/994 
 
    ตัวอย่างหน้าตา ระบบจัดการของเราจะเป็นดังรูปด้านล่าง
 
 
 


 

การกำหนด Routing

    ปกติในการแนะนำ CI4 เราจะเริ่มในส่วนของ Model Contoller และ Views ก่อนตามลำดับ แต่ในที่นี้
จะของเริ่มที่การกำหนด rule สำหรับ routing ก่อน  เพื่อให้เห็นว่า url ของการจัดการเราจะเป็นไปในรูปแบบใด
ให้เรากำหนดไฟล์ Routes.php เป็นดังนี้
 

    app/Config/Routes.pbp

/**
 * --------------------------------------------------------------------
 * Route Definitions
 * --------------------------------------------------------------------
 */

// We get a performance increase by specifying the default
// route since we don't have to scan directories.
$routes->get('/', 'Home::index');
$routes->match(['get'], 'news/delete/(:num)', 'News::delete/$1');
$routes->match(['get', 'post'], 'news/edit/(:num)', 'News::edit/$1');
$routes->match(['get', 'post'], 'news/create', 'News::create');
$routes->get('news/(:segment)', 'News::view/$1');
$routes->get('news', 'News::index');
$routes->get('(:any)', 'Pages::view/$1');
 
    สามส่วนที่เราเพิ่มเข้ามา คือส่วนที่ใช้รูปแบบคำสั่ง match() สำหรับกรณีของการเพิ่ม ลบ และแก้ไขข้อมูล
โดยในหน้า /news/create ซึ่งเป็นหน้าสำหรับเพิ่มรายการข้อมูลใหม่ เราให้รองรับการเรียกทั้งแบบ GET และ POST
คือแบบ GET กรณีเราเปิดไปยังหน้าฟอร์ม สำหรับกรอกข้อมูล ส่วนแบบ POST สำหรับรับค่าข้อมูลจากฟอร์ม ที่ส่ง
ไปทำการบันทึกลงฐานข้อมูล  ลักษณะคล้ายกันกับรูปแบบที่กำหนดให้กับหน้า /news/edit/x เมื่อ x เป็นตัวเลข เป็นค่า
id ซึ่งเป็น primary key ของตาราง news ที่รองรับทั้งแบบ GET และ POST 
    ในส่วนของการลบข้อมูลที่หน้า /news/delete/x จะรองรับแค่แบบ GET เมื่อมีการส่ง id มาทำการลบจากฐานข้อมูล
กรณีการลบข้อมูล เราสามารถกำหนดด้วยรูปแบบคำสั่ง get() ได้ เช่น
 
$routes->get('news/delete/(:num)', 'News::delete/$1');
 
    * การกำหนด rule ข้างต้น เราอาจจะตั้งคำถามว่า แบบนี้หากมีส่วนจัดการอื่นๆ มากๆ เราต้องมาเพิ่ม rule ในลักษณะนี้
ทุกครั้งหรือไม่ ในเบื้องต้นให้เราเข้าใจว่า เราสามารถกำหนด rule ในรูปแบบอัตโนมัติหรือรูปแบบที่เรากำหนดเองได้ แต่
ในที่นี้ เพื่อให้เราเข้าใจการทำงาน อย่างเป็นระบบ การกำหนด rule ในทุกรูปแบบที่จำเป็น จึงเป็นวิธีที่เหมาะสมในขณะนี้
 
    เรามาดูหน้าตาของแต่ละหน้า ในตัวอย่าง DEMO จะเป็นดังรูป ดังนี้
 
    https://www.mysslweb.com/news
 
 
    https://www.mysslweb.com/news/create
 
 
    https://www.mysslweb.com/news/elvis-sighted
 
 
    https://www.mysslweb.com/news/edit/1
 
 
 

การกำหนด Views

    เนื่องจาก เราจะมีการปรับใช้งานร่วมกับ bootstrap css framework จึงมีการปรับในส่วนของไฟล์ template เล็กน้อย
ทั้งในส่วนของ header.php และ footer.php เป็นดังนี้
 

    app/Views/templates/header.php

 
<!doctype html>
<html lang="th">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 
    <title>Document</title> 
    <link rel="stylesheet" href="https://unpkg.com/bootstrap@4.5.0/dist/css/bootstrap.min.css" >
</head>
<body>
<div class="container border p-3">
<h1><?= esc($title); ?></h1>
 

    app/Views/templates/footer.php

</div> <!--end container-->

<script src="https://unpkg.com/jquery@3.3.1/dist/jquery.min.js"></script>
<script src="https://unpkg.com/bootstrap@4.5.0/dist/js/bootstrap.min.js"></script>
<script type="text/javascript">
$(function(){
     
});
</script>
</body>
</html>
 
    ต่อไปปรับในส่วนของไฟล์ overview.php และ views.php จากบทความที่แล้ว เป็นดังนี้ โค้ดต่างๆ เกี่ยวกับ
PHP เรายังใช้รูปแบบเดิม แค่ปรับโครงสร้าง HTML เท่านั้น
 

    app/Views/news/overview.php

<h2><?= esc($title); ?></h2>
<a class="btn btn-sm btn-primary mb-2" href="/news">Overview</a>
<a class="btn btn-sm btn-success mb-2" href="/news/create">Create</a>
<table class="table table-sm">
	<thead>
		<tr>
			<th class="text-center">ID</th>
			<th class="text-left">Title</th>
			<th class="text-left">Slug</th>
			<th class="text-center">Action</th>
		</tr>
	</thead>
	<tbody>
<!--ถ้ามีข้อมูล -->
<?php if (! empty($news) && is_array($news)) : ?>	
<!--	วนลูปแสดงข้อมูล-->
    <?php foreach ($news as $news_item): ?>	
		<tr>
			<td class="text-center"><?= $news_item['id']; ?></td>
			<td class="text-left"><?= esc($news_item['title']); ?></td>
			<td class="text-left"><?= esc($news_item['slug']); ?></td>
			<td class="text-center">
			<a class="btn btn-sm btn-info mx-1" href="/news/<?= esc($news_item['slug'], 'url'); ?>">View</a>
			<a class="btn btn-sm btn-warning mx-1" href="/news/edit/<?= $news_item['id']; ?>">Edit</a>
			<a class="btn btn-sm btn-danger mx-1" href="/news/delete/<?= $news_item['id']; ?>">Delete</a>
			</td>
		</tr>
		<?php endforeach; ?>
<!--ถ้าไม่มีข้อมูล-->
<?php else : ?> 		
		<tr>
			<td class="text-center">
			No News <br>
			Unable to find any news for you.
			</td>
		</tr>
<?php endif ?>		
	</tbody>
</table>
 
 

    app/Views/news/view.php

<h2><?= esc($news['title']); ?></h2>
<hr>
<div class="p-5 bg-light"><?= esc($news['body']); ?></div>
<a class="btn btn-sm btn-secondary mt-2" href="/news">Back</a>
 
    ต่อไป เป็นส่วนของหน้าแสดงผลที่เราต้องสร้างเพิ่ม ประกอบด้วยหน้าฟอร์มสำหรับเพิ่มข้อมูลใหม่ และหน้าฟอร์มสำหรับ
แก้ไขข้อมูล ซึ่งแทบจะเหมือนกัน มีปรับเล็กน้อย ในกรณีการแก้ไข ที่ต้องมีตัวแปรข้อมูลเดิม มาแสดงในฟอร์มด้วย
 

    app/Views/news/create.php

<h2><?= esc($title); ?></h2>

<?= \Config\Services::validation()->listErrors(); ?>

<form action="/news/create" method="post">
		<?= csrf_field() ?>
	<div class="form-group">
		<label for="title">Title</label>
		<input class="form-control" type="text" name="title" value="" />
	</div>	
	<div class="form-group">
		<label for="body">Text</label>
		<textarea class="form-control" name="body"></textarea>
	</div>
	<a class="btn btn-sm btn-secondary mr-2" href="/news">Cancel</a>
	<button class="btn btn-sm btn-success"  type="submit" name="submit">Create news item</button>
</form>
 

    app/Views/news/edit.php

<h2><?= esc($title); ?></h2>

<?= \Config\Services::validation()->listErrors(); ?>

<form action="/news/edit/<?= esc($news['id']); ?>" method="post">
		<?= csrf_field() ?>
	<div class="form-group">
		<label for="title">Title</label>
		<input class="form-control" type="text" name="title" value="<?= esc($news['title']); ?>" />
	</div>	
	<div class="form-group">
		<label for="body">Text</label>
		<textarea class="form-control" name="body"><?= esc($news['body']); ?></textarea>
	</div>
	<a class="btn btn-sm btn-secondary mr-2" href="/news">Cancel</a>
	<button class="btn btn-sm btn-warning"  type="submit" name="submit">Edit news item</button>
</form>
 
    ก่อนไปต่อ เราสังเกตว่ามีสิ่งที่เราไม่คุ้น เพิ่มเข้ามาในฟอร์มทั้งสองอันนี้ นั่นคือ
 
<?= \Config\Services::validation()->listErrors(); ?>
 
    ส่วนนี้ เป็นส่วนสำหรับแสดง การตรวจสอบความถูกต้องของข้อมูลฟอร์ม ซึ่งเราจะมีกำหนดรูปแบบการตรวจสอบด้วย
การเรียกใช้งานส่วนนี้ กรณีข้อมูลที่จะบันทึกไม่ผ่านการตรวจสอบ ก็จะขึ้นแจ้งข้อความ ตามแต่รูปแบบที่กำหนด ดูตัวอย่าง
กรณีเราไม่กรอกข้อมูลใดๆ แล้วทำการ ส่งข้อมูลไปบันทึก ก็จะขึ้น error แจ้งตามรูปด้านล่าง
 
 

 

 
    ต่อมาเป็น
 
 
<?= csrf_field() ?>
 
    ส่วนนี้ เป็นการเรียกใช้ฟังก์ชั่นสำหรับ สร้าง input hidden พร้อมเก็บค่า CSRF token เพื่อป้องกันการโจมตีในขั้นตอนการ
ส่งข้อมูลของฟอร์ม เราสามารถ viewsource ดูได้ ตามรูปด้านล่าง
 
 

 
 
    ในฟอร์มแก้ไขข้อมูล เราจะเห็นว่า มีการส่งค่าตัวแปร $news เข้ามา เพื่อแสดงข้อมูลก่อนแก้ไขในฟอร์มก่อน
 
    สุดท้ายสำหรับรายการ Views ก็จะเป็นส่วนของไฟล์ success.php หรือหน้าแสดง ผลการดำเนินการ ทั้งเมื่อเพิ่มข้อมูล
เสร็จแล้ว และเมื่อแก้ไขข้อมูลเสร็จแล้ว เราก็จะส่งมาหน้านี้ทั้งสองกรณี โดยมีตัวแปร ข้อความที่ต้องการแสดง ส่งมาด้วย
 

    app/Views/news/success.php

<div class="p-2 bg-success text-white"><?= esc($info_msg); ?></div>
<a class="btn btn-sm btn-secondary mt-2" href="/news">Back</a>
 
    โครงสร้างไฟล์ Views ของเรา ก็จะมีประมาณนี้
 
 

 
 
    ตอนนี้ก็เหลือสองส่วนสุดท้ายคือ Model และ Controller
    อย่างที่ได้บอกซ้ำๆ เสมอว่า model ใน CI4 ค่อนข้างสะดวก และใช้งานง่าย ดังนั้นมาดูกัน
 

 

การกำหนด Model

    การกำหนด model เราก็จะใช้ไฟล์เดิม ที่ชื่อ NewsModel.php โดยมีกำหนดเพิ่มเติมเล็กน้อย ดังนี้
 

    app/Models/NewsModel.php

<?php namespace App\Models; // กำหนด namespace
use CodeIgniter\Model; // เรียกใช้งาน Model class
class NewsModel extends Model // สร้าง Model class โดยสืบทอดจาก Model
{
    protected $table = 'news'; // ใช้ข้อมูลตาราง news
	protected $primaryKey = 'id'; // กำหนด primary key
	
	protected $allowedFields = ['title', 'slug', 'body']; // กำหนดฟิลด์ที่อนุญาตแก้ไขได้
	
	public function getNews($slug = false)
	{
		if ($slug === false) 
		{
			 return $this->findAll();
		}
		return $this->asArray()
					->where(['slug' => $slug])
					->first();
	}
	
}
 
    บรรทัดที่เพิ่มเข้ามาก็คือบรรทัดที่ 6 กับ 8
    บรรทัดที่ 5 กับ 6 นั่น จะเป็นตัวหลักที่ใช้อ้างอิงการใช้งานในรูปแบบ CRUD ว่าต้องการจัดการกับตารางไหน
และที่ค่า primary key ใด
    $table , $primaryKey และ $allowedFields ล้วนเป็น property ของ model ที่เราสามารถระบุค่า แล้วมีผล
สัมพันธ์ต่อเนื่องในการใช้งาน ค่า $primaryKey คือค่าที่เรากำหนดเป็นค่าหลักสำหรับอ้างอิงข้อมูล ปกติก็จะใช้
ฟิลด์เดียวกับ primay key ในฐานข้อมูล แต่เราสามารถใช้ฟิลด์อื่นๆ ได้ตามต้องการ ไม่จำเป็นจะต้องเป็น primary key
เสมอไป แต่ต้องมีเงื่อนไขว่าฟิลด์นั้น จะต้องไม่ซ้ำกัน 
    ในส่วนของ $allowedFields เป็นการบอกว่า เราต้องการอนุญาตให้ทำการแก้ไขฟิลด์ข้อมูลใดบ้าง ก็สามารถกำหนด
ฟิลด์ต่างๆ ที่ต้องการในส่วนนี้ได้ ที่เหลือก็เป็นโค้ดเดิม
 

 

การกำหนด Controller

    ตัว controller จะเป็นตัวหลัก ในการควบคุมทิศทางการทำงานของโปรแกรม เรายังใช้เป็นไฟล์เดิมชื่อ News.php
และเราจะเพิ่มในส่วนของ method ต่างๆ ได้แก่ delete() create() และ edit() ต่อเพิ่มจากโค้ดเดิมดังนี้
 

    app/Controllers/News.php

<?php namespace App\Controllers;

use App\Models\NewsModel; // เรียกใช้งาน NewsModel class
use CodeIgniter\Controller;

class News extends Controller
{
	// default method สำหรับแสดง ข่าวทั้้งหมด
    public function index()
    {
		// สร้าง instance model จาก model object เพื่อใช้งาน
		$model = new NewsModel();

		// ตัวแปรที่ส่งเข้าไปใน views
		$data = [
			'news'  => $model->getNews(), // ตัวแปร $news จะเป็นข่าวทั้งหมด ที่จะสุ่งเข้าไปใน views 
			'title' => 'News archive',
		];

		// ส่วนของการแสดงผล และส่งค่าไปยัง views
		echo view('templates/header', $data);
		echo view('news/overview', $data);
		echo view('templates/footer', $data);
    }

	// method สำหรับแสดงข้อมูลข่าว เฉพาะรายการ
	public function view($slug = NULL)
	{
		// สร้าง instance model จาก model object เพื่อใช้งาน
		$model = new NewsModel();

		// กำหนดตัวแปร $news ที่จะส่งเข้าไปใน views ผ่านตัวแปร $data
		// ให้ทำการดึงข้อมูล ที่มีรวยการที่ค่า slug ตรงกับที่ส่งเข้าไป
		$data['news'] = $model->getNews($slug);

		if (empty($data['news'])) // ถ้าไม่ตรง หรือไม่มีในฐานข้อมูล
		{
			// ถ้าเข้าเงื่อนไขนี้แล้ว คำสั่งแสดงผลด้านล่างจะไม่ทำงาน
			throw new \CodeIgniter\Exceptions\PageNotFoundException('Cannot find the news item: '. $slug);
		}
		
		// ถ้ามีข้อมูลกำหนดตัวแปร $title ส่งเข้าไปใน views ผ่านตัวแปร $data
		$data['title'] = $data['news']['title'];

		// ส่วนของการแสดงผล และส่งค่าไปยัง views
		echo view('templates/header', $data);
		echo view('news/view', $data);
		echo view('templates/footer', $data);
	}
	
	// create method สำหรับเพิ่มข้อมูลใหม่
	public function create()
	{
		$model = new NewsModel();
				
		if ($this->request->getMethod() === 'post' && $this->validate([
				'title' => 'required|min_length[3]|max_length[255]',
				'body'  => 'required'
			]))
		{
			// กรณีไม่ได้กำหนดค่า id ซึ่งเป็น primary key คำสั่ง save() จะเป็นการเพิ่มข้อมูลใหม่
			$model->save([
				'title' => $this->request->getPost('title'),
				'slug'  => url_title($this->request->getPost('title'), '-', TRUE),
				'body'  => $this->request->getPost('body'),
			]);
			
			$data['info_msg'] = 'News item created successfully.';
			echo view('templates/header', ['title' => 'Information']);
			echo view('news/success',$data);
			echo view('templates/footer');
		}
		else
		{
			echo view('templates/header', ['title' => 'Create a news item']);
			echo view('news/create');
			echo view('templates/footer');
		}
	}
	
	// edit method สำหรับแก้ไขข้อมูล
	public function edit($id)
	{
		$model = new NewsModel();
		
		if(!empty($id)){
			$data = [
				'news'  => $model->find($id), // ดึงข้อมูลจาก id ที่เป็น primary key
				'title' => 'Edit News',
			];		
		}
		
		if ($this->request->getMethod() === 'post' && $this->validate([
				'title' => 'required|min_length[3]|max_length[255]',
				'body'  => 'required'
			]))
		{
			// กรณีกำหนดค่า id ซึ่งเป็น primary key คำสั่ง save() จะเป็นการอัพเดทข้อมูล
			$model->save([
				'id' => $id,
				'title' => $this->request->getPost('title'),
				'slug'  => url_title($this->request->getPost('title'), '-', TRUE),
				'body'  => $this->request->getPost('body'),
			]);
			
			$data['info_msg'] = 'News item updated successfully.';
			echo view('templates/header', ['title' => 'Information']);
			echo view('news/success',$data);
			echo view('templates/footer');

		}
		else
		{
			echo view('templates/header', $data);
			echo view('news/edit',$data);
			echo view('templates/footer');
		}
	}	
	
	// delete method สำหรับลบข้อมูล
	public function delete($id){
		$model = new NewsModel();
		
		if(!empty($id)){
			$model->delete($id); // ลบข้อมูลจากค่า id ที่เป็น primary key
		}	
		return redirect()->to('/news');		
	}
	
}
 
    ในส่วนของ method create() edit() และ delete() เราจะเห็นว่ามีการเรียกใช้ ฟังก์ชั่นของ model ด้วยกัน 3 ฟังก์ชั่น
คือ save() find() และ delete() ทั้งสามฟังก์ชั่น เป็นการจัดการกับฐานข้อมูลทั้งหมด โดยฟังก์ชั่น find() และ delete()
มีการส่งค่า primary key เข้าไป นั่นคือ find() จะทำการดึงข้อมูลของ primary key ที่ส่งเข้าไป และ delete() จะทำการ
ลบข้อมูลแถวของ primary key ที่ส่งเข้าไป ลักษณะเหมือนกับการทำงานด้วยคำสั่ง SQL เป็น
 
SELECT * FROM news WHERE id=x
DELETE FROM news WHERE id=x
    ส่วนฟังก์ชั่น save() เป็นอีกรูปแบบหนึ่งสำหรับการเพิ่มหรืแก้ไขข้อมูลที่เราเลือกใช้ คือ ถ้าเรามีการส่งฟิลด์ primary key
อย่างกรณีแก้ไขเข้าไปด้วย คำสั่ง save() นี้ก็จะทำการแก้ไขข้อมูล แต่ถ้าเราไม่ได้ส่งค่า id ซึ่งเป็น primary key เข้าไป
การทำงานของคำสั่ง save() ก็จะเป็นการ เพิ่มข้อมูลใหม่เข้าไปนั่นเอง
    ซึ่งนอกจากคำสั่ง save() แล้ว model ยังมีฟังก์ชั่น สำหรับเพิ่มข้อมูล ที่ชื่อ insert() และฟังก์ชั่นสำหรับแก้ไขข้อมูลชื่อ
update() เรียกใช้ในรูปแบบดังนี้
 
$data = [
    'username' => 'darth',
    'email'    => 'd.vader@theempire.com'
];

$model->insert($data);
 
    และ
 
$data = [
    'username' => 'darth',
    'email'    => 'd.vader@theempire.com'
];

$model->update($id, $data);
 
    แต่ในตัวอย่างเราใช้คำสั่ง save() ตามรูปแบบที่กำหนดแทน
 
    ในขั้นตอนการเพิ่ม และแก้ไขข้อมูล เราจะเห็นการใช้งาน HTTP Request object ที่ใช้สำหรับตรวจสอบ
method ที่มีการเรียกใช้งานว่าจะต้องเป็นแบบ POST รวมถึงมีการตรวจสอบความถูกต้องของข้อมูลด้วยการใช้
คำสั่ง validate() เพื่อนำข้อมูลที่ส่งมา เข้ามาตรวจสอบผ่าน valiation rule 
 
if ($this->request->getMethod() === 'post' && $this->validate([
		'title' => 'required|min_length[3]|max_length[255]',
		'body'  => 'required'
	]))
{
 
    สังเกตว่า ข้อมูล title และ body จำเป็นจะต้องกรอก และในกรณีที่เป็น title จะต้องมีขนาด 3 - 255 ตัวอักษรอีกด้วย
หาก ไม่ผ่านเงื่อนไขนี้ ก็จะไปแสดงผลในส่วนของการตรวจสอบฟอร์ม ที่ได้อธิบายไปในหน้า views 
 
    สำหรับฟิลด์ slug นั่น เนื่องจากเราใช้ข้อมูลเดียวกับ title แต่มีการนำมาแปลงด้วยฟังก์ชั่น url_title() หรือก็คือให้
ข้อความ title นั้นอยู่ในรูปแบบ url ตามที่กำหนด ดูในส่วนของการใช้งานคำสั่ง save()
 
$model->save([
	'title' => $this->request->getPost('title'),
	'slug'  => url_title($this->request->getPost('title'), '-', TRUE),
	'body'  => $this->request->getPost('body'),
]);
 
    ฟังก์ชั่น url_title() จะทำการแปลงข้อมูล title ที่ส่งแบบ POST เข้ามา โดยแทนช่องว่างด้วย "-" แล้วนำค่าที่ได้
บันทึกลงไปในส่วนของฟิลด์ slug  
    ในกรณีเพิ่มข้อมูล เราสามารถใช้ฟังก์ชั่น insert() แทนได้ ตามที่ได้อธิบายด้านบน ก็จะได้เป็น
 
$model->insert([
	'title' => $this->request->getPost('title'),
	'slug'  => url_title($this->request->getPost('title'), '-', TRUE),
	'body'  => $this->request->getPost('body'),
]);
 
     เช่นเดียวกัน กับกรณีแก้ไข ที่เราส่ง id ซึ่งเป็น primary key เข้าไปด้วย เป็น
 
$model->save([
	'id' => $id,
	'title' => $this->request->getPost('title'),
	'slug'  => url_title($this->request->getPost('title'), '-', TRUE),
	'body'  => $this->request->getPost('body'),
]);
 
    กรณีใช้เป็นคำสั่ง update() ก็จะได้เป็น
 
$model->update($id, [
	'title' => $this->request->getPost('title'),
	'slug'  => url_title($this->request->getPost('title'), '-', TRUE),
	'body'  => $this->request->getPost('body'),
]);
 
    ในขั้นตอนการแก้ไขข้อมูล เราจะเห็นว่ามีการตรวจสอบ ส่งค่า id เข้ามาหรือไม่ ถ้าส่งค่าเข้ามา ไม่เป็นค่าว่าง
ก็ใช้ค่า id นั้นไปดึงข้อมูล ที่ต้องการแก้ไข มาแสดงในฟอร์มก่อน ตามนี้
 
if(!empty($id)){
	$data = [
		'news'  => $model->find($id), // ดึงข้อมูลจาก id ที่เป็น primary key
		'title' => 'Edit News',
	];		
}
 
    สังเกตว่า เรากำหนดตัวแปร news ที่จะส่งไปใน views โดยเรียกใช้ฟังก์ชั่น find() เพือ่ดึงข้อมูลของรายการ
ที่มีค่า id ตามที่ส่งค่ามา
    
    เมื่อทำการเพิ่ม หรือแก้ไขข้อมูล เรียบร้อยแล้ว เราก็จะทำการเรียก views หน้า success.php มาแสดง
พร้อมกับส่งข้อความผ่านตัวแปร เพื่อแจ้งรายละเอียดการดำเนินการด้วย
 
$data['info_msg'] = 'News item updated successfully.';
echo view('templates/header', ['title' => 'Information']);
echo view('news/success',$data);
echo view('templates/footer');
 
    สำหรับส่วนส่วนสุดท้าย การลบข้อมูล เราทำการส่งค่า id ซึ่งเป็น primary key ไปยัง ฟังก์ชั่น delete() 
ให้ทำการลบข้อมูลตาม id ที่ส่งไป จากนั้น ก็ redirect() ไปยังหน้าข่าวหลัก ตามรูปแบบอย่างง่าย
 
if(!empty($id)){
	$model->delete($id); // ลบข้อมูลจากค่า id ที่เป็น primary key
}	
return redirect()->to('/news');	
 
    เป็นอันเสร็จเรียบร้อย ระบบ CRUD ที่ใช้งาน CI4 มีวิธีการและแนวทางไม่ซับซ้อน เป็นแนวทางทำความเข้าใจ และประยุกต์
ใช้งานต่อไป 
    ด้านล่าง จะเป็น DEMO สาธิตการใช้งาน




กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ



อ่านต่อที่บทความ









เนื้อหาที่เกี่ยวข้อง






เนื้อหาพิเศษ เฉพาะสำหรับสมาชิก

กรุณาล็อกอิน เพื่ออ่านเนื้อหาบทความ

ยังไม่เป็นสมาชิก

สมาชิกล็อกอิน



( หรือ เข้าใช้งานผ่าน Social Login )




URL สำหรับอ้างอิง











เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ