From 5126e613aadf11f04f703a8dd79a38e95ac809e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=9D=99?= Date: Mon, 29 Nov 2021 11:45:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=95=86=E5=93=81=E5=88=86?= =?UTF-8?q?=E5=8C=BA=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Models/ProductPart.php | 43 ++++++++++++++++ app/Models/ProductPartSku.php | 50 +++++++++++++++++++ app/Models/ProductSku.php | 30 +++++++++++ ...1_26_151606_create_product_parts_table.php | 34 +++++++++++++ ...6_153548_create_product_part_sku_table.php | 36 +++++++++++++ database/seeders/DatabaseSeeder.php | 4 +- database/seeders/ProductPartSeeder.php | 26 ++++++++++ 7 files changed, 222 insertions(+), 1 deletion(-) create mode 100644 app/Models/ProductPart.php create mode 100644 app/Models/ProductPartSku.php create mode 100644 database/migrations/2021_11_26_151606_create_product_parts_table.php create mode 100644 database/migrations/2021_11_26_153548_create_product_part_sku_table.php create mode 100644 database/seeders/ProductPartSeeder.php diff --git a/app/Models/ProductPart.php b/app/Models/ProductPart.php new file mode 100644 index 00000000..b5a30a57 --- /dev/null +++ b/app/Models/ProductPart.php @@ -0,0 +1,43 @@ + false, + ]; + + /** + * @var array + */ + protected $fillable = [ + 'key', + 'name', + 'is_show', + ]; + + /** + * @var array + */ + protected $casts = [ + 'is_show' => 'bool', + ]; + + /** + * 属于此分区的商品 + */ + public function skus() + { + return $this->belongsToMany(ProductSku::class, ProductPartSku::class, 'part_id', 'sku_id'); + } +} diff --git a/app/Models/ProductPartSku.php b/app/Models/ProductPartSku.php new file mode 100644 index 00000000..890182e3 --- /dev/null +++ b/app/Models/ProductPartSku.php @@ -0,0 +1,50 @@ + 0, + ]; + + /** + * @var array + */ + protected $fillable = [ + 'part_id', + 'sku_id', + 'sort', + ]; + + /** + * 此分区商品所属的SKU + */ + public function sku() + { + return $this->belongsTo(ProductSku::class, 'sku_id'); + } + + /** + * 此分区商品所属的分区 + */ + public function part() + { + return $this->belongsTo(ProductPart::class, 'part_id'); + } +} diff --git a/app/Models/ProductSku.php b/app/Models/ProductSku.php index af1e91b6..96cf2827 100644 --- a/app/Models/ProductSku.php +++ b/app/Models/ProductSku.php @@ -13,6 +13,9 @@ class ProductSku extends Model use Filterable; use HasDateTimeFormatter; + /** + * @var array + */ protected $casts = [ 'images' => JsonArray::class, 'sell_price' => Price::class, @@ -46,4 +49,31 @@ class ProductSku extends Model 'sales', 'release_at', ]; + + /** + * 仅查询已上架的商品 + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @return \Illuminate\Database\Eloquent\Builder + */ + public function scopeIsRelease($query) + { + return $query->whereNotNull('release_at'); + } + + /** + * 此商品所属的分类 + */ + public function category() + { + return $this->belongsTo(ProductCategory::class, 'category_id'); + } + + /** + * 此商品所属的分区 + */ + public function parts() + { + return $this->belongsToMany(ProductPart::class, ProductPartSku::class, 'sku_id', 'part_id'); + } } diff --git a/database/migrations/2021_11_26_151606_create_product_parts_table.php b/database/migrations/2021_11_26_151606_create_product_parts_table.php new file mode 100644 index 00000000..e00864eb --- /dev/null +++ b/database/migrations/2021_11_26_151606_create_product_parts_table.php @@ -0,0 +1,34 @@ +id(); + $table->string('key')->unique()->comment('分区KEY'); + $table->string('name')->comment('名称'); + $table->boolean('is_show')->default(false)->comment('是否显示:0 不显示,1 显示'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('product_parts'); + } +} diff --git a/database/migrations/2021_11_26_153548_create_product_part_sku_table.php b/database/migrations/2021_11_26_153548_create_product_part_sku_table.php new file mode 100644 index 00000000..6ccb7215 --- /dev/null +++ b/database/migrations/2021_11_26_153548_create_product_part_sku_table.php @@ -0,0 +1,36 @@ +id(); + $table->foreignId('part_id')->constrained('product_parts')->onDelete('cascade')->comment('分区 ID'); + $table->foreignId('sku_id')->constrained('product_skus')->onDelete('cascade')->comment('商品 ID'); + $table->integer('sort')->default(0)->comment('排序'); + $table->timestamps(); + + $table->unique(['part_id', 'sku_id']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('product_part_sku'); + } +} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 57b73b54..d204c8c2 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -13,6 +13,8 @@ class DatabaseSeeder extends Seeder */ public function run() { - // \App\Models\User::factory(10)->create(); + $this->call([ + ProductPartSeeder::class, + ]); } } diff --git a/database/seeders/ProductPartSeeder.php b/database/seeders/ProductPartSeeder.php new file mode 100644 index 00000000..5ff4f5e8 --- /dev/null +++ b/database/seeders/ProductPartSeeder.php @@ -0,0 +1,26 @@ + [ + 'name' => '精品推荐', + 'is_show' => true, + ], + ] as $key => $values) { + ProductPart::firstOrCreate(['key' => $key], $values); + } + } +}