Skip to content

Commit 8821bc4

Browse files
committed
完善假数据填充
1 parent 8b05af0 commit 8821bc4

File tree

10 files changed

+185
-24
lines changed

10 files changed

+185
-24
lines changed

database/factories/ModelsOrderFactory.php

Lines changed: 0 additions & 9 deletions
This file was deleted.

database/factories/ModelsOrderItemFactory.php

Lines changed: 0 additions & 9 deletions
This file was deleted.
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
use App\Models\CouponCode;
4+
use App\Models\Order;
5+
use App\Models\User;
6+
use Faker\Generator as Faker;
7+
8+
$factory->define(Order::class, function (Faker $faker) {
9+
// 随机取一个用户
10+
$user = User::query()->inRandomOrder()->first();
11+
// 随机取一个该用户的地址
12+
$address = $user->addresses()->inRandomOrder()->first();
13+
// 10% 的概率把订单标记为退款
14+
$refund = random_int(0, 10) < 1;
15+
// 随机生成发货状态
16+
$ship = $faker->randomElement(array_keys(Order::$shipStatusMap));
17+
// 优惠券
18+
$coupon = null;
19+
// 30% 概率该订单使用了优惠券
20+
if (random_int(0, 10) < 3) {
21+
// 为了避免出现逻辑错误,我们只选择没有最低金额限制的优惠券
22+
$coupon = CouponCode::query()->where('min_amount', 0)->inRandomOrder()->first();
23+
// 增加优惠券的使用量
24+
$coupon->changeUsed();
25+
}
26+
27+
return [
28+
'address' => [
29+
'address' => $address->full_address,
30+
'zip' => $address->zip,
31+
'contact_name' => $address->contact_name,
32+
'contact_phone' => $address->contact_phone,
33+
],
34+
'total_amount' => 0,
35+
'remark' => $faker->sentence,
36+
'paid_at' => $faker->dateTimeBetween('-30 days'), // 30天前到现在任意时间点
37+
'payment_method' => $faker->randomElement(['wechat', 'alipay']),
38+
'payment_no' => $faker->uuid,
39+
'refund_status' => $refund ? Order::REFUND_STATUS_SUCCESS : Order::REFUND_STATUS_PENDING,
40+
'refund_no' => $refund ? Order::getAvailableRefundNo() : null,
41+
'closed' => false,
42+
'reviewed' => random_int(0, 10) > 2,
43+
'ship_status' => $ship,
44+
'ship_data' => $ship === Order::SHIP_STATUS_PENDING ? null : [
45+
'express_company' => $faker->company,
46+
'express_no' => $faker->uuid,
47+
],
48+
'extra' => $refund ? ['refund_reason' => $faker->sentence] : [],
49+
'user_id' => $user->id,
50+
'coupon_code_id' => $coupon ? $coupon->id : null,
51+
];
52+
});
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
use App\Models\OrderItem;
4+
use App\Models\Product;
5+
use Faker\Generator as Faker;
6+
7+
$factory->define(OrderItem::class, function (Faker $faker) {
8+
// 从数据库随机取一条商品
9+
$product = Product::query()->where('on_sale', true)->inRandomOrder()->first();
10+
// 从该商品的 SKU 中随机取一条
11+
$sku = $product->skus()->inRandomOrder()->first();
12+
13+
return [
14+
'amount' => random_int(1, 5), // 购买数量随机 1 - 5 份
15+
'price' => $sku->price,
16+
'rating' => null,
17+
'review' => null,
18+
'reviewed_at' => null,
19+
'product_id' => $product->id,
20+
'product_sku_id' => $sku->id,
21+
];
22+
});

database/factories/UserFactory.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,6 @@
1919
'email' => $faker->unique()->safeEmail,
2020
'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret
2121
'remember_token' => str_random(10),
22+
'email_verified' => true,
2223
];
2324
});
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
use Illuminate\Database\Seeder;
4+
5+
class CouponCodesSeeder extends Seeder
6+
{
7+
public function run()
8+
{
9+
factory(\App\Models\CouponCode::class, 20)->create();
10+
}
11+
}

database/seeds/DatabaseSeeder.php

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@
44

55
class DatabaseSeeder extends Seeder
66
{
7-
/**
8-
* Run the database seeds.
9-
*
10-
* @return void
11-
*/
127
public function run()
138
{
14-
// $this->call(UsersTableSeeder::class);
9+
$this->call(UsersSeeder::class);
10+
$this->call(UserAddressesSeeder::class);
11+
$this->call(ProductsSeeder::class);
12+
$this->call(CouponCodesSeeder::class);
13+
$this->call(OrdersSeeder::class);
1514
}
1615
}

database/seeds/OrdersSeeder.php

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
3+
use App\Models\Order;
4+
use App\Models\OrderItem;
5+
use App\Models\Product;
6+
use Illuminate\Database\Seeder;
7+
8+
class OrdersSeeder extends Seeder
9+
{
10+
public function run()
11+
{
12+
// 获取 Faker 实例
13+
$faker = app(Faker\Generator::class);
14+
// 创建 100 笔订单
15+
$orders = factory(Order::class, 100)->create();
16+
// 被购买的商品,用于后面更新商品销量和评分
17+
$products = collect([]);
18+
foreach ($orders as $order) {
19+
// 每笔订单随机 1 - 3 个商品
20+
$items = factory(OrderItem::class, random_int(1, 3))->create([
21+
'order_id' => $order->id,
22+
'rating' => $order->reviewed ? random_int(1, 5) : null, // 随机评分 1 - 5
23+
'review' => $order->reviewed ? $faker->sentence : null,
24+
'reviewed_at' => $order->reviewed ? $faker->dateTimeBetween($order->paid_at) : null, // 评价时间不能早于支付时间
25+
]);
26+
27+
// 计算总价
28+
$total = $items->sum(function (OrderItem $item) {
29+
return $item->price * $item->amount;
30+
});
31+
32+
// 如果有优惠券,则计算优惠后价格
33+
if ($order->couponCode) {
34+
$total = $order->couponCode->getAdjustedPrice($total);
35+
}
36+
37+
// 更新订单总价
38+
$order->update([
39+
'total_amount' => $total,
40+
]);
41+
42+
// 将这笔订单的商品合并到商品集合中
43+
$products = $products->merge($items->pluck('product'));
44+
}
45+
46+
// 根据商品 ID 过滤掉重复的商品
47+
$products->unique('id')->each(function (Product $product) {
48+
// 查出该商品的销量、评分、评价数
49+
$result = OrderItem::query()
50+
->where('product_id', $product->id)
51+
->whereHas('order', function ($query) {
52+
$query->whereNotNull('paid_at');
53+
})
54+
->first([
55+
\DB::raw('count(*) as review_count'),
56+
\DB::raw('avg(rating) as rating'),
57+
\DB::raw('sum(amount) as sold_count'),
58+
]);
59+
60+
$product->update([
61+
'rating' => $result->rating ?: 5, // 如果某个商品没有评分,则默认为 5 分
62+
'review_count' => $result->review_count,
63+
'sold_count' => $result->sold_count,
64+
]);
65+
});
66+
}
67+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
use App\Models\User;
4+
use App\Models\UserAddress;
5+
use Illuminate\Database\Seeder;
6+
7+
class UserAddressesSeeder extends Seeder
8+
{
9+
public function run()
10+
{
11+
User::all()->each(function (User $user) {
12+
factory(UserAddress::class, random_int(1, 3))->create(['user_id' => $user->id]);
13+
});
14+
}
15+
}

database/seeds/UsersSeeder.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
use Illuminate\Database\Seeder;
4+
5+
class UsersSeeder extends Seeder
6+
{
7+
public function run()
8+
{
9+
// 通过 factory 方法生成 100 个用户并保存到数据库中
10+
factory(\App\Models\User::class, 100)->create();
11+
}
12+
}

0 commit comments

Comments
 (0)