لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 05/14/16 في كل الموقع
-
بالطبع يمكنك العمل في مجال التسويق على الانترنت وهناك سوق كبير يطلب هذه الخدمات على موقعي خمسات ومستقل. بالنسبة للمشروع الناشئ يمكنك بالطبع ويوجد عدة مشاريع ومواقع مختصة بالتسويق عربياً، ولكن ما يهم هو وجود فكرة مناسبة وتنفيذها بشكل صحيح. اقترح عليك البدء في موقع خمسات وإضافة خدمة وبعد قبولها توجه إلى مجتمع الخدمات غير الموجودة وستجد هناك العديد من الطلبات التي تستطيع تقديم عروضك عليها حتى تثبت نفسك وتنطلق في هذا المجال.1 نقطة
-
السلام عليكم انا استخدم ويندوز 10 واحتاج إلى أفضل برنامج حماية؟1 نقطة
-
بالإضافة لموقع خمسات و مستقل فتوجد مواقع أجنبية أيضا يمكنك التسجيل فيها والعمل من خلالها وأشهرها: upwork elance freelance تبحث داخل هذه المواقع حسب تخصص العمل،وبها بعض رواد الأعمال العرب أي أنه يمكنك العمل في مشاريع باللغة العربية أو مع أشقاء عرب.1 نقطة
-
وعليكم السلام أهلًا بك صديقي يستخدم المخترق برامج التحكم عن بعد هذه ليستطيع من خلالها انتاج سيرفرات اختراق، هذه السيرفرات تكون مكشوفة من قبل الكثير من أنظمة الحماية، ولكنّ يتم حقنها عبر برنامج فيجوال ستوديو، أو اوتويت ..إلخ. بحيث يتم استخراج اكواد هذه السيرفرات وإعادة تشفيرها وإضافة اكواد تمويهية بطرق مختلفة حتى تُشتت طريقة عمل برامج مكافحة الفيروسات وبعد تشفير السيرفرات يتم دمجها بالبرامج ورفعها على المنتديات أو المواقع الكبيرة مثل التورنت وعند تحميل البرنامج الملغوم أو المدموج بالسيرفر وتثبيته سوف يتم اختراقك وسيكون هناك إمكانية الوصول إلى كافة خصوصياتك مثل (الملفات وكلمات السر والصور ...إلخ) أيضًا قد يستطيعون فتح الكاميرا الخاصة بجهازك بدون علمك ولن تعرف أنه تم اختراقك لأنّ عملية تثبيت البرنامج سوف تكون طبيعية والبرنامج سوف يعمل ولكنّ الذي سوف يعمل مع البرنامج السيرفر الخاص بالهاكر وسوف يعمل بشكل خفي للأسف ولن تعلم أنت بشيء. أما بخصوص سؤالك والذي ما هو أفضل برنامج حماية؟ صراحًة لا يوجد برنامج حماية أو مكافحة فيروسات ولا يُمكن تخطيه وهذا الكلام عن تجربة فالمخترق يحاول كل جهده لتخطي هذه الحمايات بأي شكل من الأشكال. ولو تُريد نصيحتي حاول استخدام برنامج كاسبر سكاي فهو يمتلك دفاع استباقي قوي ويُعتبر معضلة أمام المخترق بحيث يصعُب تخطي الدفاع الاستباقي الخاص به أو النود. أيضًا أنصحك بتحميل البرامج من مواقعها الأصلية فقط، ولا تستخدم الكركات قدر المستطاع بل ابحث عن البرامج المجانية الأخرى وهي متوفرة وكثيرة للغاية. بالتوفيق1 نقطة
-
أهلًا بك صديقي يُمكنك فعل ذلك من خلال موقع ApkMirror بعد الدخول إلى الموقع سوف تجد شريط بحث يُمكنك من خلاله كتابة اسم التطبيق الذي تريده والضغط على Enter بعدها سوف تظهر لك قائمة يوجد بها اسم التطبيق بإصدارات مختلفة وبشكل عشوائي بمعنى سوف تظهر لك إصدارات قديمة وحديثة . الآن اضغط على اسم ورقم إصدار التطبيق الذي تريدها وبعد الضغط سوف تظهر بعض المعلومات عن التطبيق وزر عليه كلمة Download بعد ذلك انتقل بالشاشة إلى الأسفل وسوف تجد كلمة Variant وأدناها رقم الإصدار وهذا الذي سوف نضغط عليه. بعد الضغط على الرقم سوف تتوجه إلى صفحة جديدة يوجد بها زر Donwload سوف نضغط على الزر ليتم تحميل التطبيق بصيغة APK وبعد التحميل تقوم بوضع الكابيل الخاص بهاتفك في جهاز الكمبيوتر ونقل التطبيق إلى الهاتف وتنصيبه1 نقطة
-
وعليكم السلام في الآونة الأخيرة أنتشرت الكثير من مواقع العمل الحر (العمل عبر الإنترنت) ولكنّ وعن تجربة أنصحك باستخدام هذه المواقع: موقع خمسات: خمسات هو السوق العربي الأول لبيع وشراء الخدمات المصغرة، يجمع خمسات بين الشباب العربي المستعد لتقديم الخدمات، و بين فئة المشترين المستعدين لشراء هذه الخدمات، وبذلك يوفر دخلا مناسبا للشباب العربي وخدمات مميزة وبسعر اقتصادي للأفراد والشركات الناشئة. ويُمكنك التعرف على كيفية عمل الموقع من خلال صفحات الموقع: كيف يعمل الموقع، الأسئلة الشائعة. وأنصحك بمتابعة مدونة خمسات، حيث يتم نشر مقالات واستراتيجيات سوف تفيدك من خلال العمل في الموقع. موقع مستقل: يهدف مستقل لإيجاد منصة عربية تتيح لأصحاب المشاريع والشركات التعاقد مع مستقلين محترفين للقيام بأعمالهم الكبيرة والصغيرة، وبنفس الوقت يتيح للمستقلين المحترفين مكانا لإيجاد مشاريع يعملون عليها ويكسبون من خلالها. ويُمكنك التعرف على كيفية عمل الموقع من خلال صفحات الموقع: مركز المساعدة ، الأسئلة الشائعة . وأنصحك بمتابعة مدونة مستقل ، حيث يتم نشر مقالات واستراتيجيات سوف تفيدك من خلال العمل في الموقع. وهذا كتاب حول استخدام الموقع سوف يُفيدك دليل استخدام "مستقل" وطبعًا لا يُمكننا نسيان أكاديمية حسوب والتي تُعد أفضل مصدر للتعرف على العمل الحر بشكل مُفصل لذلك أنصحك بمُتابعة هذا القسم العمل الحر. وأنصحك بتحميل كتاب طريقك إلى العمل الحر عبر الإنترنت وكتاب دليلك المختصر لبدء العمل عبر الإنترنت أتمنى أن أكون أفدتك1 نقطة
-
يمكنك الحصول على رمز شفرة التعرف أو الباركود barcode عن طريق برنامج إنكسكيب حيث توجد إضافة مخصصة لذلك. إذا فتحت البرنامج اختر من شريط القوائم العلوية قائمة الإضافات extension ثم من القائمة اختر: Render>Barcode ستلاحظ وجود ثلاث خيارات يمثل كل خيار منها نموذج من نماذج الشفرة ولكل نموذج العديد من الخيارات، بالتلاعب بها سينتج لنا العديد من الشفرات. لو اخترت النموذج الأول classic وهو عبارة عن الشفرة التقليدية، ستظهر لك نافذة بعدة خانات: الأول: نوع الشفرة barcode type الثاني: بيانات الشفرة barcode data الثالث: ارتفاع الشفرة barcode Height عند وضع علامة صح بجانب عبارة live preview فسيتم عرض شكل الشفرة بشكل مباشر لمعاينة الشفرة قبل تطبيقها. عند حصولك على الشفرة المناسبة اختر apply لتطبيق الشفرة، وحينها يمكنك تلوينها وتحجيمها بل وفك التجميع عنها لإجراء المزيد من التعديلات. ملاحظة: للشفرة التقليدية classic عدد من الأنواع، إذا جربتها جميعها ستلاحظ أن الأنواع الستة الأولى تتطلب وضع قيمة في خانة بيانات الشفرة تعتمد على نوع الشفرة، فالنوع ENA5 مثلا، يشترط لتطبيقه وضع خمسة أرقام وإلا فسيعطيك البرنامج رمز خطأ، ولكل نوع من الشفرات الستة الأولى عدد معين، بقية الأنواع -عدا الستة- يمكنك تطبيقها دون وضع قيمة في خانة بيانات الشفرة. جرب بنفسك أنواع الشفرات المتبقية، والنموذجين الآخرين لتصل للشكل الذي ترغب به. النموذج التالي تطبيق عملي بالإنكسكيب للنماذج الثلاثة:1 نقطة
-
وعليكم السلام أهلًا بك أخي صراحًة لن تجد موقع لترجمة الجُمل والكلمات بشكل ممتاز، لأن الترجمة آلية وليست بشرية لذلك دائمًا في أي موقع سوف تجد اخطاء في بعض الكلمات أو الجُمل، لذلك سوف أعرض عليك أكثر من موقع يُعتبر أفضل من جوجل ولكنّ أحب أنّ أنوه عن شيء بسيط في موقع الترجمة من جوجل يوجد خاصية مميزة وهي عن الضغط على الكلمات المُترجمة تظهر لك بأكثر من معنى وهُنا أنت يُمكنك الضغط على الكلمة واختيار المعنى المناسب وترتيب الكلمات بشكل جيد مع إعادة صياغتها وهكذا سوف تُنتج جُملة مفهومة. مواقع ترجمة قد تُفيدك: http://spellcheckplus.com/ http://www.freetranslation.com/ http://translation2.paralink.com/ http://www.wordreference.com/ http://www.online/-translator.com/ http://www.whitesmoke.com/free-online-checker http://www.whitesmoke.com/free-online-checker http://www.grammarcheck.net/ المواقع التي في الأعلى لا تقوم بترجمة الكلمات بشكل حرفي مثل جوجل وتستطيع اكتشاف اخطاء القواعد الانجليزية وتصحيحها أتمنى أنّ تكون أفادتك1 نقطة
-
أهلًا بك صديقي كل متصفح له ميزات وخواص معينة وسوف اعرض عليك أفضل 5 متصفحات ويُمكنك الاختيار من بينهم أولًا: متصفح جوجل كروم على أندرويد هو الأفضل حاليًا وهذا بسبب الميزات الخاصة به مثل السرعة وخاصية البحث السريع وخاصية توفير البيانات التي تُخفض استخدام البيانات بنسبة 50%. ثانيًا: متصفح فايرفوكس ويُعتبر ثاني أفضل متصفح على أندرويد وهذا لأنّه يهتم بحماية خصوصية المُستخدمين اثناء تصفح المواقع التي تتعقب نشاط التصفح الخاص بالمُستخدمين، وخاصية التزامن. ثالثًا: مُتصفح أوبرا يُعتبر من أفضل المُتصحفات في تصفح مقاطع الفيديو وملفات الصوت وهذا بسبب ميزة ضغط البيانات لملفات الصوت والفيديو الموجودة في المتصفح ومؤخرًا تم إضفة خاصية حجب الإعلانات بشكل تلقائي مما أدى إلى زيادة سرعة التصفح من خلاله بنسبة 50%. رابعًا: متصفح UC Browser يُعتبر هذا المتصفح الأفضل في مشاهدة البرامج التلفزيونية ويحتوي على ميزة الوضع الليلي اثناء تصفح المواقع وميزة التحميل الذكي وميزة التصفح الذكي وميزة التحكم بالفيديوهات التي تشاهدها بالإضافة إلى الكثير من الميزات مثل تغيير ثيمات المتصفح ..إلخ. خامسًا: متصفح CM Browser هو متصفح جيد ويعتبر من أصغر المتصفحات في الحجم وهو سريع وآمن في التصفح وهذا بسبب احتوائه على محرك مكافحة الفيروسات. بعدها تأتي المتصفحات التالية : 6. متصفح ماكس ثون _Maxthon Browser 7. متصفح دولفين _Dolphin 8. متصفح Cool Browser 9. متصفح Yolo Browser 10. متصفح Best Browser حاليًا هذه أفضل المتصفحات على أندرويد أتمنى أنّ اكون افدتك1 نقطة
-
أولاً من خلال قائمة ابدأ ادخل على command وقم بتشغيلها كمسؤول بعدها سوف تفتح لك نافذة cmd بعدها سوف تكتب هذه الأوامر أكتب الأمر "netsh" بدون علامات التنصيص ثم اضغط على Enter بعد ذلك سوف تكتب الأمر "winsock reset" بدون علامات التنصيص ثم اضغط على Enter بعدها قم بعمل إعادة تشغيل الكمبيوتر الخاص بك وعند التشغيل سوف تُحل المُشكلة لخاصة بك وهذا عن تجربة بالتوفيق1 نقطة
-
لا أعلم إذا كان يوجد برنامج كهذا، لكن أنصحك بتقييم برنامجك بنفسك.1 نقطة
-
أبحث عن أشخاص لمساعدتي في مشروعي هل الأفضل أن أبحث عن شركاء أم عن موظفين ؟1 نقطة
-
أهلًا بك صديقي من اجل صناعة تطبيقات الأندرويد يجب عليك تعلم لغة البرمجة جافا _Java فهي المدخل الأساسي لإنشاء التطبيقات مثل الموجودة في متجر جوجل بلاي أيضًا يجب أنّ تمتلك معرفة بسيطة في كل من HTML5 وCSS. ومن أجل البدء في برمجة التطبيقات تحتاج إلى واحد من هذه البرامج (Eclipse Java Mars, NetBeans IDE، Android Studio، xamarin). والأسهل هو Android Studio، فمن خلاله سوف تستطيع صناعة تطبيقات الأندرويد مثل الموجودة في متجر جوجل بلاي، ولكن هذا سوف يعتمد على مدى سُرعتك في التعلم والإبداع في برمجة التطبيقات. أيضًا أنصحك بقراءة المقال التالي: دليلك الشامل لتعلم برمجة تطبيقات الأندرويد وهذا المقال سوف يُفيدك في تعلم برمجة تطبيقات iOS التي تعمل على أجهزة آبل مثل (هواتف آيفون ...إلخ): دليلك الشامل للبدء في تعلم برمجة تطبيقات iOS1 نقطة
-
أهلاً بك الأنسب تحديد مايحتاجه مشروعك، فاذا كنت تبحث عن شخص لأداء مهمة معينة من مهام المشروع فأنت بحاجة الى موظف أما إذا كنت تبحث عن شخص يشاركك خبرته و يقوم بدور جوهري في المشروع فأنت تبحث عن شريك. غالباً ما يضم المشروع الناشئ الصنفين و جدير بالذكر أن لكل منهما حقوق مختلفة فالشريك يجب أن يملك حقوق المساهمين و يكون صاحب منصب إداري و يتأثر دخله تبعا للربح والخسارة أما الموظف فله راتب ثابت ولا يتحمل نتائج سير المشروع بالتوفيق1 نقطة
-
يوفر تهجير قواعد البيانات Database migration في Laravel آليات لإنشاء الجداول Tablesوالتعديل عليها بغض النظر نظام إدارة قواعد البيانات المستخدم. يعني هذا أنك لن تضطر للاهتمام بالاختلافات بين نظم إدارة قواعد البيانات في صياغة أوامر SQL. يمكّن التهجير أيضا من التراجع والعودة إلى ما كانت عليه قاعدة البيانات قبل آخر التعديلات. هذا الدرس جزء من سلسلة تعلم Laravel والتي تنتهج مبدأ "أفضل وسيلة للتعلم هي الممارسة"، حيث ستكون ممارستنا عبارة عن إنشاء تطبيق ويب للتسوق مع ميزة سلة المشتريات. يتكون فهرس السلسلة من التالي: مدخل إلى Laravel 5.تثبيت Laravel وإعداده على كلّ من Windows وUbuntu.أساسيات بناء تطبيق باستخدام Laravel.إنشاء روابط محسنة لمحركات البحث (SEO) في إطار عمل Laravel.نظام Blade للقوالب.تهجير قواعد البيانات في Laravel. (هذا الدرس)استخدام Eloquent ORM لإدخال البيانات في قاعدة البيانات، تحديثها أو حذفها.إنشاء سلة مشتريات في Laravel.الاستيثاق في Laravel.إنشاء واجهة لبرمجة التطبيقات API في Laravel.إنشاء مدوّنة باستخدام Laravel.استخدام AngularJS واجهةً أمامية Front end لتطبيق Laravel.الدوّال المساعدة المخصّصة في Laravel.استخدام مكتبة Faker في تطبيق Laravel لتوليد بيانات وهمية قصدَ الاختبار. يمكن النظر إلى تهجير قواعد البيانات كما لو كان نظام إدارة نسخ خاص بقواعد البيانات، إذ يتيح لفريق العمل سهولة تغيير مخطّط Schema البيانات وتشاركه. نكمل في هذا الدرس اعتمادا على ما أنشأناه في الدروس السابقة من السلسلة. يغطي الدرس المواضيع التالية: متطلبات التهجير.أمر Artisan لتهجير قواعد البيانات.بنية التهجير.إنشاء جدول بآلية التهجير.استخدام آلية التهجير للتراجع Rollback عن التعديلات.بذر قواعد البيانات Database seeding.بنية قاعدة البيانات الخاصة بمشروع Larashop.ملفات التهجير لقاعدة بيانات Larashop.متطلبات التهجيريجب أولا إنشاء قاعدة بيانات في نظام إدارة قواعد البيانات المستخدم (MySQL في حالتنا) وإعداد معطيات الاتصال بها في Laravel ولدى أداة سطر الأوامر Artisan. إنشاء قاعدة بياناتنفذ الأمر التالي في سطر أوامر MySQL أو استخدم التطبيق المفضّل لديك (PHPMyAdmin مثلا) لإنشاء قاعدة بيانات larashop: CREATE DATABASE `larashop`;إعداد Laravel للاتصال بقاعدة البياناتأعددنا Laravel في الدرس الأول من هذه السلسلة للاتصال بقاعدة بيانات باسم larashop. في ما يلي تذكير بخطوات الإعداد. افتح الملف config/database.php واعثر على الأسطُر التالية: 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', 'localhost'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, ],حدّث القيم التالية لتوافق إعدادات MySQL لديك: 'database' => env('DB_DATABASE', 'larashop'), 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', 'melody'), إعداد معطيات اتصال Artisan بقاعدة البياناتيواجه الكثير من المطورين رسالة الخطأ التالية عند العمل على تهجير قواعد البيانات باستخدام أداة Artisan: Access denied for user 'homestead'@' localhost' (using password: YES)ستظهر الرسالة أعلاه حتى ولو كانت معطيات الاتصال في الملف configuration/database.php صحيحة. يعود السبب في ذلك إلى أن Artisan يستخدم المعطيات الموجودة في الملف env.. الحل هو إذن تحرير الملف env. الواقع في مجلد التطبيق، ستجد ما يلي: APP_ENV=local APP_DEBUG=true APP_KEY=aqk5XHULL8TZ8t6pXE43o7MBSFchfgy2 DB_HOST=localhost DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=secret CACHE_DRIVER=file SESSION_DRIVER=file QUEUE_DRIVER=sync MAIL_DRIVER=smtp MAIL_HOST=mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null حدث المتغيرات التالية: DB_HOST=localhost DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=secretلتصبح: DB_HOST=localhost DB_DATABASE=larashop DB_USERNAME=root DB_PASSWORD=melody احرص على موافقة اسم قاعدة البيانات، اسم المستخدم وكلمة مروره للمعطيات لديك. احفظ التعديلات. تهجير قواعد البيانات بأداة Artisanينشئ أمر artisan ملفا على المسار database/migrations لكل عملية تهجير. يمكن تغيير المسار الخاص بحفظ ملفات التهجير إن أردت ولكننا هنا سنكتفي بالمسار المبدئي. ننفذ الأمر التالي لإنشاء أول ملف تهجير: php artisan make:migration create_drinks_tableتظهر رسالة باسم ملف التهجير الجديد. اخترنا اسم create_drinks_table للدلالة على أن التهجير ينشئ جدولا باسم drinks في قاعدة البيانات. نتيجة الأمر هي إنشاء ملف للتهجير بنفس الاسم الذي أعطيناه مع إضافة ختم زمني قبله، مثلا: 2015_12_21_215845_create_drinks_table.phpبنية ملف التهجيرندرس الآن محتوى ملف التهجير الذي أنشأناه للتو. افتح الملف التالي لرؤية محتواه (انتبه إلى أن اسم الملف يبدأ بختم زمني للحظة إنشائه): database/migrations/2015_12_21_215845_create_drinks_table.phpنجد ما يلي: <?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateDrinksTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { // } /** * Reverse the migrations. * * @return void */ public function down() { // } }يعرف ملف التهجير صنفا جديدا باسم CreateDrinksTable يمدد الصنف Migration: CreateDrinksTable extends Migrationداخل الصنف CreateDrinksTable توجد دالة باسم up. تنفّذ تعليمات الدالة up عند تشغيل التهجير. توجد أيضا دالة باسم down في الصنف CreateDrinksTable. تنفذ تعليمات الدالة down عند التراجع عن تغييراتِ تهجير.ملف تهجير لإنشاء جدول بقاعدة البياناتليمكن إنشاء جدول في قاعدة البيانات فجيب تعريف حقوله في ملف التهجير. نعيد فتح ملف التهجير السابق ونعدله ليصبح محتواه التالي : <?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateDrinksTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('drinks', function (Blueprint $table) { $table->increments('id'); $table->string('name',75)->unique(); $table->text('comments')->nullable(); $table->integer('rating'); $table->date('juice_date'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('drinks'); } }في الدالة up: نستدعي الدالة create المعرَّفة في الصنف Schema ونمرر لها معطيين، الأول اسم الجدول الذي نريد إنشاءه drinks، والمعطى الثاني دالة غير محدّدة الاسم تعرّف حقول الجدول. نستخدم كائنا من صنف Blueprint لتعريف الجدول.نعرف أول حقل من الجدول وهو الحقل id. تعرف الدالة increments التابعة للصنف Blueprint عددا طبيعيا (عدد صحيح إشارته موجبة) يزداد تلقائيّا مع كل إدخال للبيانات في الجدول.الحقل الثاني هو حقل الاسم name، الذي نعرفه بالدالة string. تنشئ الدالة stringحقلا من سلسلة محارف مع تحديد طول السلسلة (75 في المثال). نعلّم الحقل name بالدالة unique \لجعله وحيدا وهو ما يعني أنه لا يمكن لتسجيلتين في الجدول أن تحويا نفس القيمة بالنسبة لهذا الحقل.الحقل الثالث comments نصي، وتستخدم الدالة text لتعريفه. نتيح إمكانية ألا يحوي الحقل بيانات باستخدام الدالة nullable.الحقل الرابع rating للتقيمات. نستخدم الدالة integer للإشارة إلى أنه عدد صحيح.ثم نضيف حقلا لتخزين تاريخ المشروب juice_date ونستخدم الدالة date لهذا الغرض.تُستخدم الدالة timestamps لإضافة حقلين هما created_at وupdated_at في الجدول تلقائيا. الحقلان عبارة عن ختم زمني ل، على التوالي، تاريخ إضافة التسجيلة إلى قاعدة البيانات وتاريخ آخر تحديث عليها.في الدالة down نحذف الجدول drinks من قاعدة البيانات في حالة وجوده.ننفذ بعد حفظ ملف التهجير الأمر التالي: php artisan migrateستظهر مخرجات في سطر الأوامر على النحو التالي: Migration table created successfully. Migrated: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_100000_create_password_resets_table Migrated: 2015_12_21_215845_create_drinks_tableإن نظرت في جداول قاعدة البيانات الآن فستجد التالي: ستلاحظ وجود أربعة جداول من بينها جدول drinks. الجداول الأخرى أنشأها Laravel لأن ملفات تهجيرها تأتي مبدئيا مع Laravel. التراجع عن التعديلاتيوفر التهجير إمكانية التراجع عن تعديلاته والعودة إلى حالة قاعدة البيانات قبل تنفيذه. أنشأنا في الفقرة السابقة جداول في قاعدة البيانات، ننفذ الأمر التالي للتراجع عن ذلك: php artisan migrate:rollbackتظهر الرسائل التالية: Rolled back: 2015_12_21_215845_create_drinks_table Rolled back: 2014_10_12_100000_create_password_resets_table Rolled back: 2014_10_12_000000_create_users_tableإن أعدت التحقق في MySQL سترى أن الجدول drinks لم يعد موجودا. نعيد إنشاء الجدول بتنفيذ التهجير مرة أخرى: php artisan migrateتمكن ملاحظة أن تنفيذ التهجير يكون بالتسلسل الزمني التصاعدي لتاريخ إنشاء ملفات التهجير (من الأقدم إلى الأحدث)، في ما يكون التراجع بتنفيذ ملفات التهجير حسب التسلسل الزمني التنازلي (من الأحدث إلى الأقدم). إدارة جداول البيانات في Laravel باستخدام التهجيرسنرى في هذه الفقرة كيفية استخدام التهجير للقيام بأشغال شائعة على جداول قواعد البيانات. إدراج بياناتسنرى الآن كيفية استخدام التهجير لإدراج بيانات في جدول أثناء إنشائه. ننشئ جدولا بالموظفين employees وندرج فيه 33 تسجيلة بالاعتماد على مكتبة Faker (سنخصص درسا لتفصيل استخدام Faker). نفذ الأمر التالي لإنشاء ملف تهجير لجدول employees: php artisan make:migration employeesنفتح الملف المنشأ للتو ونضيف الشفرة التالية: <?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class Employees extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('employees', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('email')->unique(); $table->string('contact_number'); $table->timestamps(); }); $faker = Faker\Factory::create(); $limit = 33; for ($i = 0; $i < $limit; $i++) { DB::table('employees')->insert([ //, 'name' => $faker->name, 'email' => $faker->unique()->email, 'contact_number' => $faker->phoneNumber, ]); } } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('employees'); } } ننشئ كائنا من صنف Faker بالتعليمة $faker = Faker\Factory::create();نحدد عدد التسجيلات التي نود إدراجها: limit$. نستخدم حلقة for التكرارية لإضافة التسجيلات إلى الجدول. تولد التعليمة faker->name$ اسما وهميّا، faker->unique()->email$ اسم بريد وحيد وfaker->phoneNumber$ رقم هاتف وهميا.الأمر التالي ينفذ التهجير: php artisan migrateتظهر الرسالة التالية دلالة على تهجير الجدول employees: Migrated: 2015_12_21_225233_employees إن بحثت الآن عن محتوى الجدول employees، مثلا بتنفيذ الاستعلام التالي في سطر أوامر MySQL: SELECT * FROM employees;ستحصُل على أسماء الموظفين، عناوينهم البريدية وأرقام هواتفهم. نتراجع عن إنشاء الجدول employees بتنفيذ الأمر: php artisan migrate:rollbackتظهر رسالة دلالة على التراجع عن إنشاء الجدول. نفتح ملف التهجير للتعديل عليه ثم نضع الشفرة الخاصة بإدراج بيانات وهمية بين علامتي تعليق، هكذا: /* $faker = Faker\Factory::create(); $limit = 33; for ($i = 0; $i < $limit; $i++) { DB::table('employees')->insert([ //, 'name' => $faker->name, 'email' => $faker->unique()->email, 'contact_number' => $faker->phoneNumber, ]); } */احفظ ملف التهجير ثم نفذ الأمر: php artisan migrateسيُنشأ جدول employees من جديد ولكن هذه المرة دون إدراج تسجيلات في الجدول. إضافة عمود إلى جدول أو حذفه منهنفرض أننا نود إضافة عمود جديد gender لتخزين جنس الموظّف، مباشرة بعد العمود contact_number. ننفذ الأمر التالي لإنشاء ملف تهجير باسم add_gender_to_employees مع تحديد الجدول الذي نريد العمل عليه وهو employees: php artisan make:migration add_gender_to_employees --table=employeesتشير التعليمة table=employees-- إلى أننا نريد العمل على الجدول employees الموجود في قاعدة البيانات. افتح ملف التهجير المنشأ بعد الأمر السابق، وعدله ليصبح على النحو التالي: <?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class AddGenderToEmployees extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('employees', function (Blueprint $table) { $table->string('gender')->after('contact_number'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('employees', function (Blueprint $table) { $table->dropColumn('gender'); }); } } في الدالة up أضفنا حقلا جديدا من نوع string (سلسلة محارف) وحددنا مكانه بأنه بعد العمود contact_number.في الدالة down نحذف الحقل gender.الآن عند تنفيذ أمر التهجير php artisan migrate ستلاحظ إضافة عمود جديد باسم gender بعد عمود contact_number. تغيير نوع عموديحتاج تغيير نوع العمود لتثبيت حزمة Doctrine Database Abstract Layer, DBAL. تُستخدم هذه الحزمة لتهجيرات التعديل على الجداول Alter table. سنستخدم أداة إدارة الاعتماديات Composer لتثبيت الحزمة. افتح ملف composer.json الذي يوجد في مجلد التطبيق. ابحث عن مقطع require: "require": { "php": ">=5.5.9", "laravel/framework": "5.2.*" },توجد في هذا المقطع حزم المكتبات التي يحتاجها تطبيقنا. حتى الآن توجد حزمتان فقط هما php وlaravel. يشير الجزء الأول (قبل النقطتين) إلى اسم الحزمة، في ما يشير الثاني لإصدارها. نضيف حزمة dbal` إلى هذه الاعتماديات، وذلك على النجو التالي: "require": { "php": ">=5.5.9", "laravel/framework": "5.2.*", "doctrine/dbal": "v2.4.2" }, لاحظ الفاصلة اللاتينية التي أضفناها بعد حزمة Laravel. نفذ الأمر التالي لتحديث المشروع: composer updateعند إنشاء العمود gender لم نحدد طول الحقل، أي أنه سيأخذ الطول المبدئي للحقول من نوع string وهو255 محرفا. ننشئ ملف تهجير جديدا لتعديل طول الحقل ليصبح 5 كحد أقصى. نعدل الملف على النحو التالي: php artisan make:migration modify_gender_in_employees --table=employeesقبول فراغ الحقول في الجدوليفترض Laravel عند إنشاء الحقول أنها لا تقبل فراغ القيمة، أي أنه يجب ذكر قيمة للحقل عند إدراج تسجيلات في الجدول. يمكننا تغيير هذا الإعداد المبدئي وجعل قيمة حقل ما اختيارية. سنأخذ الحقل gender للتمثيل به. ننشئ ملفا للتهجير: php artisan make:migration make_gender_null_in_employees --table=employeesثم نعدله على النحو التالي: <?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class MakeGenderNullInEmployees extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('employees', function (Blueprint $table) { $table->string('gender', 5)->nullable()->change(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('employees', function (Blueprint $table) { $table->string('gender', 5)->change(); }); } } تجعل الدالة nullable الحقل gender يقبل قيما فارغة.php artisan migrate إضافة مفتاح خارجي Foreign keyنصنف موظفينا حسب القسم الذي يعملون فيه. ننشئ جدولا للأقسام depts ثم نضيف مفتاحا خاريجا في جدول الموظفين employees. الأمر أدناه ينشئ ملف تهجير لجدول الأقسام: php artisan make:migration deptsعدل ملف التهجير: <?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class Depts extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('depts', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('depts'); } }ثم ننفذ أمر التهجير لإنشاء الجدول: php artisan migrateيُشترط لتصح علاقة عبر مفتاح خارجي بين جدولين أن يكون المفتاح الخارجي والمفتاح الرئيس Primary key متطابقين في النوع. استخدمنا في تعريف المفتاح الرئيس idضمن الجدول depts دالة increments التي تعطي النوع عددا طبيعيا من عشرة أرقام ;(unsigned integer INT(10 وهو ما يعني أننا سنعطي نفس النوع للمفتاح الخارجي الذي سننشئه في الجدول employees. الفرق أن المفتاح الخارجي لا يزداد تلقائيا لذا سنستخدم الدالة unsignedInteger التي لها نفس مفعول increments من حيث نوع الحقل وطوله، مع فرق أنها لا تضيف الازدياد التلقائي. ملحوظة: حتى تمكن إضافة مفتاح خارجي في الجدول employees يجب أن يكون الجدول فارغا (بدون تسجيلات). لهذا السبب علقنا في فقرة ماضية الشفرة الخاصة بـFaker. نفذ الأمر التالي لإنشاء ملف تهجير لإضافة حقل المفتاح الخارجي dept_id إلى الجدول employees: php artisan make:migration add_dept_id_in_employees --table=employeesثم نعدل ملف التهجير: <?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class AddDeptIdInEmployees extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('employees', function (Blueprint $table) { $table-> unsignedInteger ('dept_id')->after('gender'); $table->foreign('dept_id') ->references('id')->on('depts') ->onDelete('cascade'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('employees', function (Blueprint $table) { $table->dropColumn('dept_id'); }); } }ثم ننفذ التهجير: php artisan migrate بذر قواعد البياناتيشير مصطلح البذر Seeding إلى عملية إضافة بيانات وهمية لأغراض الاختبار في قواعد البيانات. نطبق هذا الإجراء على جدول drinks الذي أنشأناه في أول الدرس. نفذ الأمر التالي لإنشاء ملف للبذر: php artisan make:seeder DrinksTableSeederينشئ الأمر ملفا باسم DrinksTableSeeder.php على المسار database/seeds. افتح الملف: <?php use Illuminate\Database\Seeder; class DrinksTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { // } } يمدد الصنف DrinksTableSeeder الصنف Seeder ويعرّف الدالة run التي تُنفّذ عند تشغيل أمر البذر في Artisan. عدل الملف ليصبح محتواه التالي: <?php use Illuminate\Database\Seeder; class DrinksTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { DB::table('drinks')->insert([ 'name' => 'Orange Juice', 'comments' => 'Rich in C vitamin', 'rating' => 9, 'juice_date' => '2015-12-20', ]); } أضفنا في الدالة run أمر إدراج في جدول البيانات drinks ومررنا مصفوفة توافق عناصرها حقول الجدول مع تحديد قيم عناصر المصفوفة. ننفذ الأمر أمر البذر لإضافة التسجيلة أعلاه إلى الجدول: php artisan db:seed --class=DrinksTableSeederنمرر لأمر البذر php artisan db::seed اسم الملف المراد تنفيذه. الآن عند التحقق نجد في جدول قاعدة البيانات التسجيلة التالية: قاعدة البيانات الخاصة بمشروع Larashopتعرفنا في الفقرات الماضية على أساسيات التهجير في Laravel. سنجعل هذه المعرفة موضع التطبيق لإنشاء قاعدة بيانات لمشروع Larashop. ستشنرك جميع الجداول في الحقول التالية التي أنشأناها لأغراض الفحص والتدقيق. التسلسلالحقلنوع البياناتالوصف1created_at Timestamp ختم زمني لتاريخ إدراج التسجيلة2updated_at Timestamp ختم زمني لتاريخ تحديث التسجيلة3created_at_ip (Varchar(45 عنوان IP المستخدم لإدراج التسجيلة4updated_at_ip (Varchar(45 عنوان IP المستخدم لتحديث التسجيلةجدول منشورات المدونةالتسلسلالحقلنوع البياناتالوصف1id INT مفتاح رئيس (AUTOINCREMENT) عدد طبيعي يزداد تلقائيا2url (Varchar(255 رابط الصفحة3title (Varchar(140 عنوان الصفحة4description (Varchar(170 وصف يظهر في محركات البحث5content Text محتوى الصفحة أو المنشور 6conblogtent (Tinyint(1 يحدد ما إذا كان المنشور صفحةجدول التصنيفاتالتسلسلالحقلنوع البياناتالوصف1id INT مفتاح رئيس (AUTOINCREMENT) عدد طبيعي يزداد تلقائيا2name (Varchar(255 اسم التصنيفجدول العلامات التجاريةالتسلسلالحقلنوع البياناتالوصف1id INT مفتاح رئيس (AUTOINCREMENT) عدد طبيعي يزداد تلقائيا2name (Varchar(255 اسم العلامة التجاريةجدول المنتجاتلكل منتج تصنيف وعلامة تجارية وحيدين. التسلسلالحقلنوع البياناتالوصف1id INT مفتاح رئيس (AUTOINCREMENT) عدد طبيعي يزداد تلقائيا2name (Varchar(255 اسم المنتج3title (Varchar(140 عنوان المنتج4description (Varchar(500 عنوان المنتج5price int ثمن المنتج6category_id int معرف تصنيف المنتج7brand_id int معرف العلامة التجارية للمنتجملفات التهجير لجداول قاعدة بيانات المشروعسننشئ في هذه الفقرة ملفات تهجير لجداول البيانات المذكورة أعلاه؛ سنضيف أيضا بعض البيانات الوهمية إلى الجداول باستخدام آلية البذر التي تعرفنا عليها سابقا. توليد ملفات التهجيرافتح سطر الأوامر ونفذ الأوامر التالية لتوليد ملفات الجداول: جدول منشورات المدونة: php artisan make:migration create_posts_table جدول تصنيفات المنتجات php artisan make:migration create_categories_tableجدول العلامات التجارية للمنتجات php artisan make:migration create_brands_tableجدول المنتجات php artisan make:migration create_products_tableتحرير ملفات التهجيرننتقل لتحرير كل ملف من ملفات التهجير. جدول منشورات المدونة <?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreatePostsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('posts', function (Blueprint $table) { $table->increments('id'); $table->string('url', 255)->unique(); $table->string('title', 140); $table->string('description', 170); $table->text('content'); $table->boolean('blog'); $table->timestamps(); $table->string('created_at_ip'); $table->string('updated_at_ip'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('posts'); } } جدول التصنيفات <?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateCategoriesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('categories', function (Blueprint $table) { $table->increments('id'); $table->string('name', 255)->unique(); $table->timestamps(); $table->string('created_at_ip'); $table->string('updated_at_ip'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('categories'); } } جدول العلامات التجارية <?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateBrandsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('brands', function (Blueprint $table) { $table->increments('id'); $table->string('name', 255)->unique(); $table->timestamps(); $table->string('created_at_ip'); $table->string('updated_at_ip'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('brands'); } } جدول المنتجات <?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateProductsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('products', function (Blueprint $table) { $table->increments('id'); $table->string('name', 255)->unique(); $table->string('title', 140); $table->string('description', 500); $table->integer('price'); $table->unsignedInteger('category_id'); $table->unsignedInteger('brand_id'); $table->timestamps(); $table->string('created_at_ip'); $table->string('updated_at_ip'); // مفتاح خارجي على جدول التصنيفات $table->foreign('category_id') ->references('id')->on('categories') ->onDelete('cascade'); // مفتاح خارجي على جدول العلامات التجارية $table->foreign('brand_id') ->references('id')->on('brands') ->onDelete('cascade'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('products'); } }بذر قاعدة بيانات المشروعندرج بيانات وهمية في جداول قاعدة البيانات قصدَ الاختبار. أنشئ ملفات البذر بتنفيذ الأوامر أدناه على التوالي: php artisan make:seeder CategoriesTableSeeder php artisan make:seeder BrandsTableSeeder php artisan make:seeder ProductsTableSeederيحوي جدول المنتجات مفتاحين خارجيين لجدولي التصنيف والعلامة التجارية. لذا يجب البدء بهما (لا يصح إدراج مفتاح خارجي لتسجيلة غير موجودة في الجدول الذي مثل المفتاح الخارجي مرجعا إليه). بذر جدول التصنيفات <?php use Illuminate\Database\Seeder; class CategoriesTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { DB::table('categories')->insert(['name' => 'MENS']); DB::table('categories')->insert(['name' => 'WOMENS']); DB::table('categories')->insert(['name' => 'KIDS']); DB::table('categories')->insert(['name' => 'FASHION']); DB::table('categories')->insert(['name' => 'CLOTHING']); } } بذر جدول العلامات التجارية<?php use Illuminate\Database\Seeder; class BrandsTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { DB::table('brands')->insert(['name' => 'ACNE']); DB::table('brands')->insert(['name' => 'RONHILL']); DB::table('brands')->insert(['name' => 'ALBIRO']); DB::table('brands')->insert(['name' => 'ODDMOLLY']); } } بذر جدول المنتجات<?php use Illuminate\Database\Seeder; class ProductsTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { DB::table('products')->insert(['name' => 'Mini skirt black edition', 'title' => 'Mini skirt black edition','description' => 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna','price' => 35,'category_id' => 1,'brand_id' => 1,]); DB::table('products')->insert(['name' => 'T-shirt blue edition', 'title' => 'T-shirt blue edition','description' => 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna','price' => 64,'category_id' => 2,'brand_id' => 3,]); DB::table('products')->insert(['name' => 'Sleeveless Colorblock Scuba', 'title' => 'Sleeveless Colorblock Scuba','description' => 'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna','price' => 13,'category_id' => 3,'brand_id' => 2,]); } } ثم ننفذ أوامر البذر لكل جدول. خاتمةتعرفنا في هذا الدرس على تهجير قواعد البيانات وبذرها في Laravel. كما أننا حددنا هيكلة قاعدة بيانات المشروع الذي نعمل عليه. في الدروس القادمة سنتعرف على إطار عمل Eloquent الذي سنعتمد عليه للتخاطب مع قاعدة البيانات وعرض محتوياتها عند الاقتضاء. ترجمة -وبتصرّف- لمقال Laravel 5 Migrations لصاحبه Rodrick Kazembe.1 نقطة