Codeقاعدة بيانات Igniter: تهيئة البيانات وتحديثها وحذفها

⚡ ملخص ذكي

Codeيقوم برنامج Igniter Database ببناء نماذج ووحدات تحكم لمدير جهات الاتصال المدعوم بواسطة MySQL. يقوم نموذج BaseModel المشترك بتنفيذ عمليات الإدراج والقراءة والتحديث والحذف، وترثه النماذج الفرعية Pals و Cities، لذلك تعيد وحدات التحكم استخدام عمليات قاعدة البيانات نفسها عبر التطبيق.

  • 🗄️ مخطط: جدولان مرتبطان، pals و cities، يمثلان علاقة واحد لواحد بواسطة مفتاح خارجي.
  • ⚙️ التكوين: يقوم ملف database.php بتعيين الاتصال ويتم تحميل مكتبة قاعدة البيانات.
  • 🧬 النموذج الأساسي: يُعرّف النموذج الأصل get_all و get_by_id و get_where و insert و update و delete.
  • 🇧🇷 ميراث: يقوم كل من Pals و Cities بتوسيع BaseModel، لذا فهم يعيدون استخدام أساليبه ويتجاوزونها عند الحاجة.
  • 🔗 ينضم: يقوم نموذج Pals بربط المدن للحصول على اسم المدينة إلى جانب تفاصيل الاتصال.
  • 🎛️ التحكم: تقوم وحدات التحكم في المدن وجهات الاتصال بتوصيل النماذج والاستمارات والتحقق من الصحة معًا.
  • ♻️ إعادة استخدام: تعمل خاصية الوراثة على إزالة التعليمات البرمجية المتكررة لعمليات CRUD والحفاظ على بساطة النماذج.

Codeقاعدة بيانات Igniter

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 مع نماذج Pals و Cities

سنقوم بإنشاء نموذجين كما هو موضح في الصورة أعلاه. أنشئ فئة جديدة باسم 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 - عرض - تنزيل

الأسئلة الشائعة

يحتوي النموذج الأساسي (BaseModel) على طرق الإدراج والقراءة والتحديث والحذف المشتركة مرة واحدة. ترث النماذج الفرعية هذه الطرق وتستبدل فقط ما يختلف منها، مما يزيل التكرار ويحافظ على صغر حجم كل نموذج.

يخزن كل جهة اتصال معرّف المدينة (city_id)، وليس اسم المدينة. يُجري التعديل عملية ربط لجدول المدن بحيث تُعيد الاستعلامة اسم المدينة المقروء بجانب كل جهة اتصال في نتيجة واحدة.

يقوم المتحكم بتحميل النموذج، والتحقق من صحة النموذج المُرسَل، ثم إما يحفظ البيانات ويعيد التوجيه، أو يعيد تحميل النموذج مع وجود أخطاء. كما يربط النموذج، والعروض، ومكتبة التحقق من الصحة.

نعم. انطلاقاً من تعريفات الجداول الخاصة بك، يمكن للذكاء الاصطناعي إنشاء نموذج أساسي مع طرق CRUD ونموذج فرعي واحد لكل جدول، مع إضافة تجاوزات الربط حيث يحتاج المفتاح الخارجي إلى تسمية قابلة للقراءة. Revاطلع على عمليات الربط التي تم إنشاؤها.

توفر مكتبة قواعد البيانات طرق الاستعلام الخام وطرق Active Record. يقوم نموذج بتغليف هذه الاستدعاءات في عمليات ذات معنى وقابلة لإعادة الاستخدام لجدول معين، مع الحفاظ علىping الوصول إلى البيانات من وحدة التحكم.

تلخيص هذه التدوينة بـ: