php 链接两家工厂- Laravel关系

mctunoxg  于 2022-12-17  发布在  PHP
关注(0)|答案(1)|浏览(117)

所以我的任务是创建订单表,我们首先需要ORDER表中的订单ID,但是,要获得ORDER表中的total_price,我们需要订单表。
正如您所看到的,这两个表需要同时处于活动状态/同时创建,以便将数据填充到它们中。
我该怎么做呢?
订单工厂:

<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;
use App\Models\User;
use App\Models\OrderItem;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Order>
 */
class OrderFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition()
    {
        return [
            'id' => fake()->numerify('######'),
            'user_id' => User::inRandomOrder()->first()->id,
            'status' => 'paid',
            'total_price' => OrderItem::where('user_id', 'user_id')->sum('unit_price'),
        ];
    }
}

订单项工厂:

<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;
use App\Models\Order;
use App\Models\Product;
use App\Models\User;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\OrderItem>
 */
class OrderItemFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition()
    {
        $product = Product::inRandomOrder()->first();

        return [
            'order_id' => Order::inRandomOrder()->first()->id,
            'user_id' => User::inRandomOrder()->first()->id,
            'product_id' => $product->id,
            'quantity' => mt_rand(1, 10),
            'unit_price' => $product->price,
        ];

    }
}

尝试解析

这很好用,但我相信有更好的方法
订单种子:

public function run()
    {
        for($i = 0; $i < 15; $i++)
        {
            $order = Order::factory()->create();

            $orderItems = OrderItem::factory()->count(3)->for($order)->create();
    
            $orderTotal = 0;
            foreach ($orderItems as $orderItem)
            {
                $orderTotal = $orderTotal + ($orderItem->quantity*$orderItem->unit_price);
            }
    
            $order->total_price = $orderTotal;
            $order->save();
        }
    }
njthzxwz

njthzxwz1#

这个问题有很多解决方法。
首先,遵循文档中的方法-https://laravel.com/docs/9.x/eloquent-factories#factory-relationships
第二:为你的工厂创建州,更多信息请点击https://laravel.com/docs/9.x/eloquent-factories#factory-states。
但第二种方法的一个简单示例如下所示:订单工厂:

public function withItems()
    {
        return $this->afterCreating(function ($attributes) {
            OrderItem::factory()->create([
                'order_id' => $attributes['id']
            ]);
        });
    }

您可以创建不同的状态并将其与其他工厂组合。

相关问题