Codeقاعدة بيانات Igniter: تهيئة البيانات وتحديثها وحذفها
⚡ ملخص ذكي
Codeيقوم برنامج Igniter Database ببناء نماذج ووحدات تحكم لمدير جهات الاتصال المدعوم بواسطة MySQL. يقوم نموذج BaseModel المشترك بتنفيذ عمليات الإدراج والقراءة والتحديث والحذف، وترثه النماذج الفرعية Pals و Cities، لذلك تعيد وحدات التحكم استخدام عمليات قاعدة البيانات نفسها عبر التطبيق.
Codeقاعدة بيانات Igniter
في الدرس السابق، غطينا أساسيات Codeبرنامج Igniter Active Record وكيفية إدراج السجلات وتحديثها وحذفها وقراءتها من قاعدة البيانات. في هذا الدرس التعليمي، سنقوم بإنشاء نماذج قواعد البيانات واستخدام النماذج لإنشاء سجلات قاعدة البيانات وتحديثها. إذا كنت جديدًا تمامًا على العمل مع قواعد البيانات، Codeيا مُشعل، يُنصح بقراءة البرنامج التعليمي السابق لأول مرة.
Codeتكوين قاعدة بيانات Igniter
سنبدأ بإنشاء قاعدة بيانات مشروع البرنامج التعليمي. سننشئ قاعدة بيانات بسيطة لإدارة بيانات الاتصال، تتكون من جدولين: جدول "الأصدقاء" وجدول "المدن التي يعيشون فيها". العلاقة بين جدول "الأصدقاء" وجدول "المدن" هي علاقة واحد إلى واحد، حيث يكون "id" في جدول "المدن" هو المفتاح الأساسي، و"city_id" هو المفتاح الخارجي في جدول "الأصدقاء".
قم بتشغيل البرامج النصية التالية لإنشاء قاعدة البيانات:
CREATE TABLE `pals` ( `id` int(11) NOT NULL AUTO_INCREMENT, `city_id` int(11) DEFAULT NULL, `contact_name` varchar(245) DEFAULT NULL, `contact_number` varchar(245) DEFAULT NULL, `email_address` varchar(245) DEFAULT NULL, PRIMARY KEY (`id`) );
لنقم الآن بإنشاء جدول المدن:
CREATE TABLE `cities` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(245) DEFAULT NULL, PRIMARY KEY (`id`) );
Codeنماذج قاعدة بيانات Igniter
سنقوم الآن بإنشاء نماذج لقاعدة بياناتنا. النموذج هو الجزء M من MVC. يتعامل النموذج مع الوصول إلى البيانات ومعالجة البيانات ومنطق الأعمال.
In Codeفي Igniter، يجب على كل نموذج تحديد الطرق التي سيدعمها. بدلاً من تكرار نفس الكود في كل نموذج، سنستفيد من الوراثة في البرمجة كائنية التوجه، وسننشئ فئة نموذج رئيسية تحدد الطرق الأساسية التي نريد أن تدعمها نماذجنا.
يوضح الجدول أدناه الطرق التي سنحددها وكيف سيتم الوصول إلى البيانات.
| S / N | الأسلوب | الوصف |
|---|---|---|
| 1 | __إنشاء | يُعرّف هذا الأسلوب طريقة البناء التي تستدعي طريقة البناء الأصلية. |
| 2 | get_all | يسترجع جميع الحقول والسجلات من قاعدة البيانات دون أي شروط. |
| 3 | get_by_id | يسترجع صفًا واحدًا من قاعدة البيانات باستخدام المفتاح الأساسي من نوع INT المسمى id. |
| 4 | get_where | يسترجع جميع الحقول من قاعدة البيانات بناءً على المعايير المحددة. |
| 5 | أدخل | يُدرج سجلاً جديداً في قاعدة البيانات. |
| 6 | تحديث | يقوم بتحديث سجل قاعدة بيانات موجود بناءً على المفتاح الأساسي من نوع INT المسمى id. |
| 7 | حذف | يقوم بحذف سجل موجود من قاعدة البيانات بناءً على المفتاح الأساسي من نوع INT المسمى id. |
تُظهر الصورة التالية مخطط الفئات وكيفية ارتباط نماذج الأطفال Pals و Cities بنموذج الأصل BaseModel.
سنقوم بإنشاء نموذجين كما هو موضح في الصورة أعلاه. أنشئ فئة جديدة باسم BaseModel في الملف application/models/BaseModel.php وأضف الكود التالي:
<?php class BaseModel extends CI_Model { protected $table = ''; public function __construct() { parent::__construct(); } public function get_all() { return $this->db->get($this->table) ->result(); } public function get_by_id($id) { return $this->db->get_where($this->table, array('id' => $id)) ->row(); } public function get_where($where) { return $this->db->where($where) ->get($this->table) ->result(); } public function insert($data) { return $this->db->insert($this->table, $data); } public function update($id, $data) { $this->db->where('id', $id); $this->db->update($this->table, $data); } public function delete($id) { $this->db->where('id', $id); $this->db->delete($this->table); } }
هنا:
- يُعرّف المتغير `$table` المحمي باسم `table`. ويتم ملؤه بواسطة الفئة الفرعية المعنية لتحديد الجدول الذي يجب أن تتفاعل معه طرق النموذج الأساسي.
- public function __construct() {…} تُعرّف الدالة البانية وتُنفذ الدالة البانية للفئة الأصلية CI_Model.
- تستخدم الدالة get_all() {…} مكتبة قاعدة البيانات وقيمة $table لتشغيل استعلام SELECT.
- get_by_id($id) {…} يسترجع صفًا واحدًا ويقبل معلمة $id من نوع بيانات INT.
- تُعرّف الدالة get_where($where) {…} طريقة get التي تسمح لك بتعيين شرط where.
- تقبل الدالة insert($data) {…} مصفوفة المعاملات $data التي تحتوي على القيم المراد كتابتها في قاعدة البيانات.
- تقبل الدالة update($id, $data) {…} مصفوفة المعاملات $data التي تحتوي على القيم المراد تحديثها.
- تقبل الدالة delete($id) {…} مُعاملًا $id من نوع البيانات INT.
بعد الانتهاء من فئة النموذج الأصلية، لنقم بإنشاء نموذج الأصدقاء (Pals). أنشئ ملفًا جديدًا في application/models/Pals_model.php وأضف الكود التالي:
<?php class Pals_model extends BaseModel { protected $table = 'pals'; public function __construct() { parent::__construct(); } public function get_by_id($id) { $this->db->where('pals.id', $id); $this->db->select('pals.*,cities.name'); $this->db->from('pals'); $this->db->join('cities', 'pals.city_id = cities.id'); $query = $this->db->get(); return $query->row(); } public function get_all() { $this->db->select('pals.*,cities.name'); $this->db->from('pals'); $this->db->join('cities', 'pals.city_id = cities.id'); $query = $this->db->get(); return $query->result(); } }
هنا:
- class Pals_model extends BaseModel {…} extends the parent model BaseModel and automatically makes all its methods access to the child class.
- protected $table = 'pals'; يحدد اسم الجدول المرتبط بهذا النموذج.
- __construct() {…} يقوم بتهيئة المُنشئ الأب.
- تقوم الدالة العامة get_by_id($id) {…} بتجاوز الدالة get_by_id لتوفير تطبيق مخصص. يستخدم الاستعلام عملية ربط لاسترداد اسم المدينة من جدول المدن.
- public function get_all() {…} overrides get_all to implement a join query between the pals and cities.
أنشئ ملفًا جديدًا في application/models/Cities_model.php:
<?php class Cities_model extends BaseModel { protected $table = 'cities'; public function __construct() { parent::__construct(); } }
هنا:
- محمي $table = 'المدن'؛ يحدد جدول قاعدة البيانات النموذجية.
كما ترون، يوفر لنا التوريث الكثير من الوقت عند العمل مع النماذج في Codeأنبوب.
وحدات تحكم مدير الاتصالات
بعد أن أنشأنا النماذج، لننشئ الآن وحدات التحكم لتطبيقنا. سيكون لدينا وحدتا تحكم: المدن وجهات الاتصال. لنبدأ بالمدن. أنشئ ملفًا جديدًا باسم Cities.php في مجلد application/controllers وأضف الكود التالي:
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class Cities extends CI_Controller { public function __construct() { parent::__construct(); $this->load->helper('url', 'form'); $this->load->library('form_validation'); $this->load->model('cities_model'); } public function index() { $header['title'] = 'Cities Listing'; $data['pals'] = $this->cities_model->get_all(); $this->load->view('header',$header); $this->load->view('cities/index', $data); $this->load->view('footer'); } public function create() { $header['title'] = 'Create City'; $this->load->view('header',$header); $this->load->view('cities/create'); $this->load->view('footer'); } public function store() { $rules = array( array( 'field' => 'name', 'label' => 'City Name', 'rules' => 'required' ) ); $this->form_validation->set_rules($rules); if ($this->form_validation->run() == TRUE) { $data = array('name' => $this->input->post('name')); $this->cities_model->insert($data); redirect(base_url('cities')); } else { $header['title'] = 'Create City'; $this->load->view('header',$header); $this->load->view('cities/create'); $this->load->view('footer'); } } public function edit($id) { $header['title'] = 'Edit City'; $data['city'] = $this->cities_model->get_by_id($id); $this->load->view('header', $header); $this->load->view('cities/edit', $data); $this->load->view('footer'); } public function update($id) { $rules = array( array( 'field' => 'name', 'label' => 'City Name', 'rules' => 'required' ) ); $this->form_validation->set_rules($rules); if ($this->form_validation->run() == TRUE) { $data = array('name' => $this->input->post('name')); $this->cities_model->update($id,$data); redirect(base_url('cities')); } else { $header['title'] = 'Edit City'; $data['city'] = $this->cities_model->get_by_id($id); $this->load->view('header',$header); $this->load->view('cities/create',$data); $this->load->view('footer'); } } public function delete($id) { $header['title'] = 'Delete City'; $data['city'] = $this->cities_model->get_by_id($id); $this->load->view('header', $header); $this->load->view('cities/delete', $data); $this->load->view('footer'); } public function destroy($id) { $this->cities_model->delete($id); redirect(base_url('cities')); } }
هنا:
- ينفذ الكود أعلاه جميع الطرق اللازمة لإنشاء وتحديث وحذف وقراءة الصفوف من قاعدة البيانات.
أنشئ ملفًا آخر باسم Contacts.php في مجلد application/controllers وأضف الكود التالي:
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class Contacts extends CI_Controller { public function __construct() { parent::__construct(); $this->load->helper('url', 'form'); $this->load->library('form_validation'); $this->load->model('pals_model'); } public function index() { $header['title'] = 'Contacts List'; $data['pals'] = $this->pals_model->get_all(); $this->load->view('header', $header); $this->load->view('contacts/index', $data); $this->load->view('footer'); } public function create() { $this->load->model('cities_model'); $header['title'] = 'Create Contact'; $data['cities'] = $this->cities_model->get_all(); $this->load->view('header', $header); $this->load->view('contacts/create', $data); $this->load->view('footer'); } public function store() { $rules = array( array( 'field' => 'contact_name', 'label' => 'Contact Name', 'rules' => 'required' ), array( 'field' => 'contact_number', 'label' => 'Contact Number', 'rules' => 'required', 'errors' => array( 'required' => 'You must provide a %s.', ), ), array( 'field' => 'email_address', 'label' => 'Email Address', 'rules' => 'required' ), array( 'field' => 'city_id', 'label' => 'City', 'rules' => 'required' ) ); $this->form_validation->set_rules($rules); if ($this->form_validation->run() == FALSE) { $this->load->model('cities_model'); $header['title'] = 'Create Contact'; $data['cities'] = $this->cities_model->get_all(); $this->load->view('header', $header); $this->load->view('contacts/create', $data); $this->load->view('footer'); } else { $data = array( 'city_id' => $this->input->post('city_id'), 'contact_name' => $this->input->post('contact_name'), 'contact_number' => $this->input->post('contact_number'), 'email_address' => $this->input->post('email_address'), ); $this->pals_model->insert($data); redirect(base_url('contacts')); } } public function edit($id) { $this->load->model('cities_model'); $header['title'] = 'Edit Contact'; $data['cities'] = $this->cities_model->get_all(); $data['pal'] = $this->pals_model->get_by_id($id); $this->load->view('header', $header); $this->load->view('contacts/edit', $data); $this->load->view('footer'); } public function update($id) { $rules = array( array( 'field' => 'contact_name', 'label' => 'Contact Name', 'rules' => 'required' ), array( 'field' => 'contact_number', 'label' => 'Contact Number', 'rules' => 'required', 'errors' => array( 'required' => 'You must provide a %s.', ), ), array( 'field' => 'email_address', 'label' => 'Email Address', 'rules' => 'required' ), array( 'field' => 'city_id', 'label' => 'City', 'rules' => 'required' ) ); $this->form_validation->set_rules($rules); if ($this->form_validation->run() == FALSE) { $this->load->model('cities_model'); $header['title'] = 'Create Contact'; $data['cities'] = $this->cities_model->get_all(); $data['pal'] = $this->pals_model->get_by_id($id); $this->load->view('header', $header); $this->load->view('contacts/edit', $data); $this->load->view('footer'); } else { $data = array( 'city_id' => $this->input->post('city_id'), 'contact_name' => $this->input->post('contact_name'), 'contact_number' => $this->input->post('contact_number'), 'email_address' => $this->input->post('email_address'), ); $this->pals_model->update($id, $data); redirect(base_url('contacts')); } } public function delete($id) { $this->load->model('cities_model'); $header['title'] = 'Delete Contact'; $data['cities'] = $this->cities_model->get_all(); $data['pal'] = $this->pals_model->get_by_id($id); $this->load->view('header',$header); $this->load->view('contacts/delete',$data); $this->load->view('footer'); } public function destroy($id){ $this->pals_model->delete($id); redirect(base_url('contacts')); } }
طرق عرض مدير جهات الاتصال
لقد تناولنا بالفعل موضوع النماذج والتحقق من صحتها في Codeسنستخدم الكود الذي طورناه في الدروس السابقة حول استخدام Igniter. ولإتمام الصورة، ستكون واجهات تطبيقنا كما يلي:
يمكنك تنزيل رمز العرض بالنقر على الرابط أدناه:
Codeمدير جهات اتصال Igniter - عرض - تنزيل



