أشارك ما أعرفه عن البرمجة، وتجارب أخرى.

كيفية إنشاء تعبئة قاعدة البيانات ببيانات وهمية باستخدام Laravel Factories

تم نشرها بتاريخ 2019-09-10 في شروح ، برمجيات

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


فلنقل أننا نقوم بتصميم موقع خاص بعرض مقالات فعند وصولنا لمرحلة تصميم الواجهات اﻷمامية للموقع وكيفية عرض قائمة المقالات وعرض كل مقالة على حدة عادة مانحتاج إدخال عدة مقالات لقاعدة البيانات نقوم بالتجربة عليها، فنقوم بإدخال عنوان المقالة ومحتواها وصورة لها وتكرار هذه العملية عدة مرات، مما يستهلك وقتا منا، ولكن بهذه المقالة سنقوم بإستخدام laravel factories وسنرى كم أنها تسهل هذه العملية.

لنبدأ بالعمل سنقوم بإنشاء مشروع لارافل جديد عن طريق الامر

Laravel new factories

ونقوم بإنشاء قاعدة بيانات جديدة باسم factories، ونقوم بكتابتها بملف env الخاص بنا.


DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=factories
DB_USERNAME=root
DB_PASSWORD=123

ونقوم بإنشاء الجداول لقاعدة البيانات هذه عن طريق migrations بإنشاء واحد يقوم بتكوين جدول المقالات التي سأقوم بتسميته posts سأقوم بالأمر التالي

php artisan make:migration create_posts_table

وسأقوم بتكوين الحقول حسب التالي



class CreatePostsTable extends Migration
{
   /**
    * Run the migrations.
    *
    * @return void
    */
   public function up()
   {
       Schema::create('posts', function (Blueprint $table) {
           $table->bigIncrements('id');
           $table->string('title');
           $table->text('body');
           $table->string('photo_path');
           $table->timestamp('published_at');
           $table->timestamps();
       });
   }

   /**
    * Reverse the migrations.
    *
    * @return void
    */
   public function down()
   {
       Schema::dropIfExists('posts');
   }

}



ولنقم  بتكوين factory الذي سيقوم بتوليد بيانات وهمية حسب نوع الحقول التي قمنا بتكوينها، و لإنشائه نقوم بتنفيذ الامر 

php artisan make:factory PostFactory


وعن طريق هذا الامر سيتم تكوين كلاس باسم PostFactroy تحت المجلد database/factories ليكون محتواه بدايةً كالتالي:



define(Model::class, function (Faker $faker) {
   return [
       //
   ];
});


نلاحظ أنه يتم تحديد factory جديد من نوع Model محدد فلهذا سنقوم بتغيرها إلى Post Model الذي سنقوم بإنشاءه لأننا ليس لدينا واحد بعد، ونلاحظ أنه بالدالة التي تقوم بإرجاع مصفوفة التي سنقوم بها بتحديد كل حقل وماذا نريد أن يكون نوع البيان الذي نريد تكوينه، ونلاحظ أيضا أن الدالة تقوم بإستقبال كائن من نوع faker التي هي الحزمة مستقلة تقوم بتوليد بيانات من عدة أنواع حسب التصنيفات التي ستجدها بالحزمة.

والآن لنستكمل بإنشاء Post Model عن طريق الامر


php artisan make:model Post

ونقوم بتحديد نوع البيانات لكل حقل



define(Post::class, function (Faker $faker) {
   return [
       'title'      => $faker->sentence,
       'body'       => $faker->text,
       'photo_path' => $faker->imageUrl(640, 480, 'cats'),
       'published_at' => $faker->dateTime
   ];
});

قمت أولا بتغيير اسم Model ليكون Post ويتم تكوين هذا factory عليه، وقمت بتحديد ماهي نوع البيانات التي أريد تكوينها لكل حقل منها حسب الانواع التي توفرها الحزمة، حقل العنوان title قمت بتحديد نوع البيانات لتكون sentence التي ستقوم بتكوين جملة كاملة، والحقل boby والذي هو محتوى المقالة قمت بتحديد نوع text والذي سيقوم بتكوين نصوص تكون طويلة وبها عدد كبير من الكلمات، ولحقل مسار الصورة قمت بإختيار نوع imageUrl وحددت العرض ليكون 640 والطول ليكون 480 ولتكون الصورة المكونة خاصة بصور القطط، واخيرا لحقل تاريخ النشر published_at حددت انه من نوع dateTime ليتم تكوين تاريخ ووقت.


أما الآن كيف نقوم بتكوين هذه البيانات؟

سنقوم بإستخدام Laravel Seeders والتي هي كلاسات يتم استدعائها لتقوم بتعبئة قاعدة البيانات إما بيانات ثابتة يتم تحديدها مسبقا أو عن طريق استدعاء factories بها ليتم تكوين بيانات وهمية، لتكوين واحد نقوم بالامر التالي:

php artisan make:seeder PostsTableSeeder

ليتم تكوين كلاس باسم PostsTableSeeder داخل المجلد database/seeds, سنقوم بتكوين 10 مقالات عن طريق factories كالاتي


class PostsTableSeeder extends Seeder
{
   /**
    * Run the database seeds.
    *
    * @return void
    */
   public function run()
   {
       factory('App\Post', 10)->create();
   }
}


والان لتكوين هذه البيانات نقوم بتنفيذ الامر

php artisan db:seed --class=PostsTableSeeder

الذي يقوم باستدعاء وتنفيذ الكود السابق الذي سيقوم بتكوين 10 مقالات، ونلاحظ بعد انتهاء الامر تكوينها بجدول posts بقاعدة البيانات


Photo by Mika Baumeister on Unsplash

خولة الشح

تمت كتابتها بواسطة خولة الشح