للقيام بعملية إختبار التطبيق ( التصميم، عمليات 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) ستقوم بتوليد نص مكون من عشر كلمات.
ماذا لو كان التطبيق الخاص به يحتوي على جداول كثيره، هل سأقوم بإنشاء دوال إدخال البيانات في داخل الدالة 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
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.
$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_locale إلى ar_SA وذلك من خلال الذهاب إلى الملف config/app.php
config/app.php from 'faker_locale' => 'en_US', to 'faker_locale' => 'ar_SA',
كما يمكن إيضا توليد البيانات مع إعادة إنشاء الحقول migrate:fresh وذلك بإضافة الخيار --seed حيث يتم حذف جميع الجداول وإنشاؤها من جديد وإدخال البيانات
php artisan migrate:fresh --seed
كانت هذه محاولة مبسطة لتوليد البيانات بإستخدام seeders و factory في التدوينات القادمة بمشيئة الله سنتحدث عن كيفية توليد البيانات بإستخدام العلاقات بين الجداول Model Factory.
ll
الشرح اكتر من رائع شكرا جزيلا على ايصال المعلومة بطريقة مبسطة
زائر
شرحك جميل جدا ليش ما تعمل كورس عربي مدفوع للارفل بصراحة بتوصل معلومة وشوحك راقي