Factories :
- Rôle : Les usines sont utilisées pour définir la structure et les données de test pour les modèles de votre application. Elles fournissent un moyen de créer facilement des instances de modèles avec des données fictives.
- Utilisation : Les usines sont principalement utilisées dans les tests automatisés (tests unitaires, tests fonctionnels, etc.) pour créer des données de test de manière dynamique. Elles peuvent également être utilisées manuellement pour générer des données de test dans le cadre du développement ou de la vérification du fonctionnement de votre application.
- Différence clé : Les usines ne manipulent pas directement la base de données. Elles génèrent simplement des instances de modèles avec des données simulées, mais n'interagissent pas avec la base de données elle-même.
Seeders :
- Rôle : Les semoirs sont utilisés pour alimenter initialement la base de données avec des données prédéfinies. Ils sont souvent utilisés pour peupler la base de données avec des données statiques ou de référence nécessaires au fonctionnement de l'application.
- Utilisation : Les semoirs sont généralement utilisés dans le processus de développement initial ou lors de la configuration de l'application pour fournir des données de base. Ils peuvent être utilisés pour insérer des données de référence telles que des rôles d'utilisateur, des paramètres de configuration, etc.
- Différence clé : Contrairement aux usines, les semoirs interagissent directement avec la base de données pour insérer des données. Ils sont généralement utilisés pour insérer des enregistrements statiques qui ne changent pas fréquemment.
Exemple
Create Product Model:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
use HasFactory;
protected $fillable = [
'name',
'description',
'price',
'category_id',
];
public function category()
{
return $this->belongsTo(Category::class);
}
}
Create Category Model:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
use HasFactory;
protected $fillable = [
'name',
'description',
];
public function products()
{
return $this->hasMany(Product::class);
}
}
Create Migrations:
Category Migration:
php artisan make:migration create_categories_table --create=categories
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCategoriesTable extends Migration
{
public function up()
{
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->text('description')->nullable();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('categories');
}
}
Product Migration:
php artisan make:migration create_products_table --create=products
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateProductsTable extends Migration
{
public function up()
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->text('description');
$table->decimal('price', 10, 2);
$table->unsignedBigInteger('category_id');
$table->timestamps();
$table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
});
}
public function down()
{
Schema::dropIfExists('products');
}
}
Factories:
Category Factory:
<?php
namespace Database\Factories;
use App\Models\Category;
use Illuminate\Database\Eloquent\Factories\Factory;
class CategoryFactory extends Factory
{
protected $model = Category::class;
public function definition()
{
return [
'name' => $this->faker->word,
'description' => $this->faker->sentence,
];
}
}
Product Factory:
<?php
namespace Database\Factories;
use App\Models\Product;
use Illuminate\Database\Eloquent\Factories\Factory;
class ProductFactory extends Factory
{
protected $model = Product::class;
public function definition()
{
return [
'name' => $this->faker->name,
'description' => $this->faker->paragraph,
'price' => $this->faker->randomFloat(2, 10, 1000),
'category_id' => function () {
return \App\Models\Category::factory()->create()->id;
},
];
}
}
Create Seeders:
Category Seeder:
php artisan make:seeder CategorySeeder
Category Seeder (database/seeders/CategorySeeder.php):
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\Category;
class CategorySeeder extends Seeder
{
public function run()
{
Category::factory()->count(10)->create();
}
}
Product Seeder:
php artisan make:seeder ProductSeeder
Define the logic in your seeders:
Product Seeder (database/seeders/ProductSeeder.php):
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\Product;
class ProductSeeder extends Seeder
{
public function run()
{
Product::factory()->count(50)->create();
}
}
Run the Seeders:
After defining the seeders, you can run them using the db:seed Artisan command:
php artisan db:seed --class=CategorySeeder
php artisan db:seed --class=ProductSeeder