لارافيل, Others / 2024-09-07

إستخدام Seeder و Factory في توليد بيانات عشوائية في لارافيل، وكيفية إدخال البيانات باللغة العربية

إستخدام Seeder و Factory في توليد بيانات عشوائية في لارافيل، وكيفية إدخال البيانات باللغة العربية

2024-09-07 وقت القراءه : 5 دقائق

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


في إطار العمل لارافيل، يوجد لدينا إمكانية لإدخال بيانات بكميات كبيرة وذالك من خلال Laravel Seeder، لذلك في هذه المقالة سوف نتعرف على مفومي Seeders و Factory واللذان يساعداننا على إنشاء وتوليد البيانات.


لو ذهبنا للمسار 

database->seeds->DatabaseSeeder.php
public function run(){
    \App\Models\User::factory(10)->create();
}

كما نلاحظ أنها مجهزه مسبقا بكود إدخال 10 مستخدمين إلى قاعدة البيانات، ولإدخال البيانات نستخدم الأمر

php artisan db:seed


لفرض أن لدي جدول Posts وأريد إدخال البيانات 

`posts`(`id`, `title`, `body`, `active`, `user_id`)

لإدخال البيانات، في المسار database->seeds->DatabaseSeeder.php نقوم بكتابة جملة الإدخال بداخل الدالة run

public function run()
{
    for ($i=0;$i<=100;$i++){
        Post::create([
            'title'=>'Post Title',
            'body'=>'Post Body',
            'user_id'=>User::all()->random()->id,
            'active'=>rand(0,1)
        ]);
    }
}

كما نلاحظ بالفعل أنه تم إدخال البيانات لكن ملا نلاحظه أن title, content هي نفسها في جميع الصفوف، ولتجاوز ذلك وفرت لارافيل ما يسمى faker حيث يقوم بإنشاء بيانات بشكل عشوائي.، ولإستخدامها

public function run()
{
    $faker=Factory::create();
    for ($i=0;$i<=100;$i++){
        Post::create([
            'title'=>$faker->sentence(10),
            'body'=>$faker->sentence(100),
            'user_id'=>User::all()->random()->id,
            'active'=>$faker->boolean()
        ]);
    }
}

نلاحظ إننا إستخدمنا sentence حيث تقوم بإنشاء كلمات بعدد البارميتر المحدد مثلا sentence(10) ستقوم بتوليد نص مكون من عشر كلمات.


ما هو Seeders؟

ماذا لو كان التطبيق الخاص به يحتوي على جداول كثيره، هل سأقوم بإنشاء دوال إدخال البيانات في داخل الدالة run، بالطبع لو كان يتم إدخال البيانات لجدولين فقط فلا يوجد مشكله في ذلك، لكن إذا كان يتم إدخال البيانات لعدد كبير فإننا بحاجة لإنشاء seeders.

لإنشاء seeder

php artisan make:seeder PostsTableSeeder

حيث أن PostsTableSeeder هو إسم إختياري، ويتم إنشاؤه في المسار 

database->seeds->PostsTableSeeder.php

ويحتوي على الدالة run حيث بداخلها يتم كتابة جملة إدخال البيانات.

هنا يجب نقل محتويات الدالة run في الملف database->seeds->DatabaseSeeder.php إلى الدالة run في ملف seeder الجديد الذي تم إنشاؤه

class PostsTableSeeder extends Seeder
{
    public function run()
    {
        $faker=Factory::create();
        for ($i=0;$i<=100;$i++){
            Post::create([
                'title'=>$faker->sentence(10),
                'body'=>$faker->sentence(100),
                'user_id'=>User::all()->random()->id,
                'active'=>$faker->boolean()
            ]);
        }
    }
}


الأن بعد أن قمنا بحذف جمل الإدخال من الدالة run في المسار  database->seeds->DatabaseSeeder.php فإنه لن يتم إدخال البيانات، لأن الأمر ينفذ فقط الدالة run  database->seeds->DatabaseSeeder.php ولا ينفذها في الكلاسات الأخرى التي نقوم بإنشاؤها.

ولتنفيذ الدالة run في الكلاسات التي يتم إنشاؤها، يوجد طريقتين:

الطريقة الأولى 

تنفيذ الأمر db:seed مع إعطاؤه إسم الكلاس

 php artisan db:seed --class=PostsTableSeeder

الطريقة الثانية

إستدعاء الكلاس PostsTableSeeder بداخل الدالة run في الكلاس databaseSeeder

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $this->call(PostsTableSeeder::class);
    }
}

ومن ثم تنفيذ الأمر 

php artisan db:seed


ما هو factory

الطريقة أعلاه هي طرق صحيحة لإدخال البيانات، إلا إنها لا تعتبر إحترافية، حيث وفرت لارافيل ما يسمى factory لإدخال بيانات بشكل عشوائي

ولإنشاء factory

php artisan make:factory PostFactory --model=Post

ويتم إنشاؤه في المسار 

database/factories/PostFactory.php
class PostsFactory extends Factory
{
    protected $model = Post::class;


    public function definition()
    {
        return [
            //
        ];
    }
}

هنا يجب الإنتباه لإسم الـ factory حيث إنه مثلا إذا كنا نريد إدخال بيانات في جدول Post يجب أن يكون إسم الكلاس PostFactory وإذا كان Student يجب أن يكون إسم الكلاس StudentFactory.

بداخل الدالة return نقوم بكتابة الحقول لإدخال البيانات

public function definition()
{
    return [
        'title'=>$this->faker->sentence(10),
        'body'=>$this->faker->sentence(100),
        'user_id'=>User::all()->random()->id,
        'active'=>$this->faker->boolean()
    ];
}

وفي الكلاس database->seeds->DatabaseSeeder.php بداخل الدالة run نقوم بتنفيذ أمر إدخال البيانات وذلك بكتابة الأمر التالي

Post::factory(100)->create();

كما نلاحظ أننا قمنا بتحديد عدد السجلات التي نريد إدخالها في قاعدة البيانات، وهي 100.

ومن ثم تنفيذ الأمر 

php artisan db:seed


مثال أخر

ماذا لو أردنا إنشاء faker لجدول الطلاب بحيث نريد إدخال البيانات التالية:-

`id`, `name`, `email`, `mobile`, `age`, `gender`, `address_info`,

إنشاء Factory

php artisan make:factory StudentFactory --model=Student

كتابة جمل الإدخال للحقول بداخل return 

class StudentFactory extends Factory
{
    protected $model = Student::class;

    public function definition()
    {
        return [
            "name" => $this->faker->name(),
            "email" => $this->faker->unique()->safeEmail,
            "mobile" => $this->faker->phoneNumber,
            "age" => $this->faker->numberBetween(25, 45),
            "gender" => $this->faker->randomElement([
                "male",
                "female",
            ]),
            "address_info" => $this->faker->address
        ];
    }a
}

ومن ثم في ملف database->seeds->DatabaseSeeder.php

نكتب أمر factory

public function run()
{
    User::factory(10)->create();
    Student::factory(100)->create();
}

ومن ثم تنفيذ الأمر

php artisan db:seed

هنا سيتم إدخال عشرة سجلات لجدول User و 100 سجل لجدول Student.


ما هي أنواع البيانات التي يوفرها لنا الكلاس faker ؟

$this->faker->name()
$this->faker->unique()->safeEmail تعني أنه يجب إن لا يتم تكرار البريد الإلكتروني، 
  safeEmail تعني بريد إلكتروني وهمي(غير موجود).
$this->faker->phoneNumber
$this->faker->nuberBetween(25,45)
$this->faker->randomeElement([
            “male”,”female”
])
$this->faker->address
$this->faker->randomDigit; 
$this->faker->word;
$this->faker->paragraph
$this->faker->lastName;
$this->faker->city;
$this->faker->year;
$this->faker->domainName;
$this->faker->creditCardNumber;

هذه أهم أنواع البيانات التي يتم التعامل معها، مع العلم أنه يوجد أنواع أخرى 

هل يمكن توليد بيانات عشوائية بإستخدام faker باللغة العربية؟

نعم، يمكن ذلك وذلك من خلال تحديد تغيير قيمة faker_locale إلى ar_SA وذلك من خلال الذهاب إلى الملف config/app.php

config/app.php
from
'faker_locale' => 'en_US',
to
'faker_locale' => 'ar_SA',


إستخدام seed مع migration؟

كما يمكن إيضا توليد البيانات مع إعادة إنشاء الحقول migrate:fresh وذلك بإضافة الخيار --seed حيث يتم حذف جميع الجداول وإنشاؤها من جديد وإدخال البيانات

php artisan migrate:fresh --seed


كانت هذه محاولة مبسطة لتوليد البيانات بإستخدام seeders و factory في التدوينات القادمة بمشيئة الله سنتحدث عن كيفية توليد البيانات بإستخدام العلاقات بين الجداول Model Factory.


التعليقات
زائر
منذ 3 سنوات

شرحك جميل جدا ليش ما تعمل كورس عربي مدفوع للارفل بصراحة بتوصل معلومة وشوحك راقي

ahmed
منذ سنة

ll

maram as
منذ 9 أشهر

الشرح اكتر من رائع شكرا جزيلا على ايصال المعلومة بطريقة مبسطة

إضافة تعليق
Loading...