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

PHP Laravel Factory Fake Data

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

فلنقل أننا نقوم بتصميم موقع خاص بعرض مقالات فعند وصولنا لمرحلة تصميم الواجهات اﻷمامية للموقع وكيفية عرض قائمة المقالات وعرض كل مقالة على حدة عادة مانحتاج إدخال عدة مقالات لقاعدة البيانات نقوم بالتجربة عليها، فنقوم بإدخال عنوان المقالة ومحتواها وصورة لها وتكرار هذه العملية عدة مرات، مما يستهلك وقتا منا، ولكن بهذه المقالة سنقوم بإستخدام 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 بقاعدة البيانات
database-records