Laravel's factory system introduces the recycle method, allowing efficient reuse of model instances across multiple factory calls. This feature is particularly valuable when creating complex data structures with shared relationships.
// Basic recycling
$category = Category::factory()->create();
$products = Product::factory()
->count(3)
->recycle($category)
->create();
Let's explore a practical example of an e-commerce testing environment:
<?php
namespace Tests;
use App\Models\Store;
use App\Models\Product;
use App\Models\Category;
use App\Models\Order;
use Tests\TestCase;
class StoreTest extends TestCase
{
public function test_can_generate_sales_report()
{
// Create base structure
$store = Store::factory()->create();
$categories = Category::factory()
->count(3)
->recycle($store)
->create();
// Create products in categories
$products = Product::factory()
->count(20)
->recycle($store)
->recycle($categories)
->create();
// Generate orders using same products
$orders = Order::factory()
->count(50)
->recycle($store)
->recycle($products)
->create()
->each(function ($order) use ($products) {
// Add 1-5 random products to each order
$orderProducts = $products->random(rand(1, 5));
$order->products()->attach(
$orderProducts->pluck('id')->mapWithKeys(function ($id) {
return [$id => ['quantity' => rand(1, 5)]];
})
);
});
// Test report generation
$report = $store->generateSalesReport();
$this->assertNotNull($report);
$this->assertEquals(50, $report->total_orders);
}
}
The recycle method significantly improves factory performance by reusing existing models instead of creating new instances for each relationship.