الجزء 7: أستخدام الModel
في الجزء السادس من تعلم Laravel 5 , انشئتُ الأتصال بقاعدة البيانات من نوع sqlite, وأسترجعتُ
المعلومات من الجدول من قاعدة البيانات بأستخدام الأمر التالي:
DB::table(‘news’)->get();
حيث في كل مرة يتم استرجاع
البيانات من الجدول يتم استدعاء الكود اعلاه, هذا ليس من ميزات
Laravel حيث انها تتسم
بالسهولة والديناميكية! بعد انتهاء الدرس لهذا اليوم سترى ان الكود اعلاه يصبح
بهذا الشكل:
$news->get();
عن طريق استخدام الModel, حيث اننا
تعلمنا كيف نستخدم الControllers والViews ودرس هذا
اليوم سيكون عن الModel وبهذا سيكتمل مفهوم الMVC Model-View-Controller للLaravel
أول شيء لكل جدول بيانات يجب ان
يكون له , Modelويفضل اسم الModel مقترن بأسم
الجدول اي نفس الأسم حتى يتم التمييز بين الModels:
الModel عبارة عن
ملف php يجب ان ينشأ داخل مجلد App, سأقوم بأنشاء Model للnews table وسأسميه بnews تيمماً بأسم
الجدول كالأتي:
طبعاً في البدء يكون هذا الملف ملف
php عادي لا
يحتوي على كود, او شيء يجب اضافة الnamespace
App; ليكون من ضمن
نطاق الApp namespace , وبعدها سأستخدم الModel وسأورث كل صفات هذا الصنف Class:
use Illuminate\Database\Eloquent\Model as
Eloquent;
class news extends Eloquent{
}
وبذلك انتهى عمل الModel الخاص بالnews J
طريقة استخدامه في الController:
يجب استدعاء ملف الnews model عن طريق
الكود ادناه:
use App\news;
وبعدها يمكن التمتع بكافة مزايا الmodel الخاص بالnews :
يوجد طريقتين لأستخدام الnews model اما بطريقة
الstatic كالأتي:
news::get();
او بطريقة الObject كالأتي:
news $news;
$news->get();
ملاحظة: عن استخدام الObject اعلاه: يجب
ان يكون news $news موجود في function parameter.
والصورة التالية توضح استخدام الnews model:
في الدرس السابق عندما انشئتُ
الروابط لعناوين الأخبار كان الرابط عبارة عن معرف الخبر الرقمي كالأتي:
/news/{id}
ولكن ماذا لو اردت ان يكون الرابط
يشير الى عنوان مختصر وليس معرف رقمي للخبر؟!
الحل هو بأنشاء حقل جديد في جدول
الnews من نوع string وتسميته
بأسم slug , يجب استرجاع عمل الجدول عن طريق الأمر التالي:
php artisan migrate:rollback
وبعدها تعديل الmigration الخاص بعمل ذلك الجدول بأضافة الحقل كالأتي:
ومن ثم انشاء الجدول من جديد, عن
طريق الأمر التالي:
php artisan migrate
ملاحظة: عند تطبيق الmigrate:rollback فأن الجدول
ومحتوياته ستحذف!!!
والأن سندرج معلومات في جدول الnews عن طريق الtinker وبأستخدام
الmodel الخاص بالnews:
كما تلاحظ في الصورة اعلاه يتم
استخدام الtinker عن
طريق كتابة الأمر التالي:
php artisan tinker
وبعدها الأشارة الى الnews model عن طريق
انشاء كائن سميتهَ $news:
$news = new App\news;
وسندرج خصائص ذلك الكائن ومن ثم نبطق دالة save() لتخزين الكائن
في الجدول:
$news->title = ‘something’;
$news->slug = ‘something’;
$news->content = ‘something’;
$news->save();
ولأظهار البيانات من الجدول عن
طريق الأمر التالي:
App\news::all()->toArray();
والأن لغرض تجربة عمل الرابط للتنقل
بين الأخبار عن طريق الslug الخاص بالخبر بدل الرقم التعريفي الخاص بالخبر,
وذلك عن طريق تزويد الslug للURL مباشرة
وتعديل دالة show في الNewsController كالأتي:
كما تلاحظ في الصورة اعلاه, بدل
تزويد دالة الshow ب$id قمتُ بتزويد
$slug وبعدها عمل جملة استعلام حسب ال$slug المزود كالأتي:
$news = news::where(‘slug’,$slug)->first();
تعمل هذه الدالة على استرجاع كائن
من الجدول الذي عامود الslug الخاص به يساوي متغير الslug المزود
وبأسترجاع اول كائن first()
فعند كتابة الURL بالشكل
التالي: /news/{slug} سيتم اظهار الواجهة كالأتي:
لقد قلت فيما مضى يمكن استخدام الnews model اما بطريقة static او بطريقة object ويجب ان
تعرف عند استخدام طريقة الobject تعتبر هذه الطريقة هي حقن الدالة نفسها بالparameter كالأتي:
والأن يجب تعديل الروابط في واجهة
الindex لكي يكون توجيه الروابط بالشكل التالي: /news/{slug}
لاحظ عند الضغط على اي رابط من الروابط
اعلاه ستوجه لملف التوجيه routes.php , ملف التوجيه نفسه سيستلم الURL التي تساوي
القيمة /news/{slug} وبعدها يقوم بتحويلها للدالة المعنية في الNewsController , قبل التوجيه للدالة في الController سنقوم بعمل
مايسمى بRoute Model Binding اي دمج الmodel مع الroute , الفائدة
من عمل ذلك هو لتمرير قيم من الmodel الى route وبعدها الroute يمررها للcontroller,
لاحظ في الصورة اعلاه, عند الضغط
على احد الروابط ستتوجه قيمة الslug بمتغير اسمه {news} في الكود ادناه:
get(‘news/{news}’,’NewsController@show’);
لاحظ عمل Route Model Binding قبل عملية التوجيه:
Route::bind(‘news’,function($slug){
Return App\news::whereSlug($slug)->first();
});
حيث قيمة الslug في متغير الnews سيتم
تضمينها داخل دالة ومن تلك الدالة سيسترجع الكائن الذي الSlug الخاص به يساوي
الslug المزود, وبذلك تم تضمين الكائن في متغير الnews حيث سيكون
المسترجع للدالة الshow في الNewsController هو Object:
لاحظ في الصورة اعلاه, المسترجع في
دالة ال show() من ملف routes.php هو كائن object وسيتم تمرير ذلك الكائن للواجهة التي تسمى بshow.
النتيجة لدرس اليوم عند زيارة /news
وعند الضغط على احد الروابط يتم
توجيهنا كالأتي: /news/{slug}
والأن لنفترض اننا نريد تهيئة عمل
تعديلedit لأحد الأخبار, طبعاً او شيء يجب تحديد
التوجيه في ملف التوجيه routes.php كالأتي:
لاحظ التوجيه للتعديل يتم لنفس
كائن الخبر Route Model Binding: /news/{news}/edit , سيتم التوجيه للدالة التي تسمى بedit داخل الNewsController مع تزويد تلك الدالة بالكائن Object الذي نريد
تعديله {news}
في دالة الedit في الNewsController سيستقبل الكائن object
المسترجع من الroutes.php ويضعه في متغير $news وبعدها يتم
التعديل عليه ....
الناتج:
Comments
Post a Comment