所以我的任务是创建订单表,我们首先需要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();
}
}
1条答案
按热度按时间njthzxwz1#
这个问题有很多解决方法。
首先,遵循文档中的方法-https://laravel.com/docs/9.x/eloquent-factories#factory-relationships
第二:为你的工厂创建州,更多信息请点击https://laravel.com/docs/9.x/eloquent-factories#factory-states。
但第二种方法的一个简单示例如下所示:订单工厂:
您可以创建不同的状态并将其与其他工厂组合。