0

Laravel 4 で e コマース アプリケーションを開発していますが、データベース設計の問題を解決するためのアドバイスが必要です。

問題:

私のクライアントは、複数のバリエーション/オプションを持つ製品を持っています。例えば:

Product1 = Apple Iphone 5

カラーオプション:ブラック


  1. Option1 黒の場合: 16GB

    オプション 1 の在庫 : 15

    オプション 1 の販売価格 : $900


  2. Option2 黒の場合: 32GB

    Option2 の在庫 : 32

    オプション 2 の販売価格: $1.200


  3. Option3 黒の場合: 128GB

    オプション 3 の在庫 : 24

    オプション 3 の販売価格 : $1.700


カラーオプション:ホワイト


  1. Option1 ホワイトの場合: 32GB

    オプション 1 の在庫 : 9

    オプション 1 の販売価格 : $930


  2. Option2 ホワイトの場合: 64GB

    オプション 2 の在庫 : 12

    オプション 2 の販売価格: $1.270


Product2 = Motorola Xoom 9868AB ケース

素材オプション : レザー


  1. Option1 革: グレー

    オプション 1 の在庫 : 90

    オプション 1 の販売価格 : $12


  2. Option2 レザー: ピンク

    オプション 2 の在庫 : 12

    オプション 2 の販売価格 : $12.70


材料オプション: ハードシェル


  1. Option1 ハードシェル用: ブラック

    オプション 1 の在庫 : 51

    オプション 1 の販売価格: $32.90


私のアプローチ:

上記のように、オプション、在庫、価格の種類が異なる多くの製品があります。私は belongsToMany() で次のようなことを試しました:

表: 製品

id 
name
created_at
updated_at

表:バリエーション

id
title
parent
created_at
updated_at

表:商品バリエーション

id
products_id
variations_id
stock 
purchase_price 
sales_price
created_at
updated_at

製品モデル:

<?php
class Products extends Eloquent {
   protected $table = 'products';
   protected $fillable = array('name');
   public function variations() {
   return $this->belongsToMany('Variations','product_variation')
               ->withPivot('purchase_price', 'stock', 'sales_price')
               ->withTimestamps();
    }
}

注文モデルはどうあるべきか? 注文には hasMany() 製品とバリエーションがあります。問題へのアプローチはどのようになりますか?

4

5 に答える 5

1

オプション テーブルは、製品テーブルを持つ hasAndBelongsToMany() である必要があります。次に、各株と価格がオプション テーブルに hasAndBelongsToMany() である必要があります。

製品表:

id
product_name
created_at
updated_at

オプション表:

id
option_name
created_at
updated_at

option_product テーブル:

id (optional(
option_id
product_id
created_at
updated_at

在庫表:

id
count
created_at
updated_at

option_stock テーブル:

id (optional)
option_id
stock_id
created_at
updated_at

価格表:

id
price
created_at
updated_at

option_price テーブル:

id (optional)
option_id
price_id
created_at
updated_at

これにより、多くの異なる製品に適用できるオプション色の紫の 1 つのエントリと、紫のさまざまな価格を持つことができます。また、オプションや他のテーブルを熱心にロードできるため、クエリがそれほどひどいものになることはありません(http://laravel.com/docs/eloquent#eager-loadingを参照)

<?php
$products = Product::with(array(
   'options',
   'options.stock',
   'options.prices'
))
->get();

サイトの製品を作成する管理者側は非常に簡単に行うことができますが、それは別の問題です.

于 2013-08-24T07:27:08.703 に答える
0

複数の値を持つ各属性には、外部キーがベース アイテムである独自のテーブルが必要です。たとえば、ベース テーブルに iPhone を配置し、色、メモリ サイズなどを独自のテーブルとして使用できます。価格表には、価格と、アイテム (白、64 GB、iPhone) を完全に説明するすべての外部キーが含まれます。

作業中に「データベースの正規化」を調べたいと思うかもしれません。

于 2013-08-21T17:59:09.653 に答える
0

http://www.couchbase.com/のような noSQL データベースを確認することをお勧めします。私の場合、一部のプロジェクトの一部の製品/サービスで同様の問題が発生しました。Json / オブジェクトの保存が役に立ちました。couchbase に移行することに決めて本当によかったです。

于 2013-08-27T11:33:30.487 に答える