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.