2014-02-21 37 views
0

我的工作對這個問題有一段時間了,但我似乎並沒有得到理想的解決方案。第二個屬性選擇列表的產品 - Laravel關係

我正在與產品的網上商店。這些產品可以包含不同的尺寸,顏色或/和材料。

我想要的:
一個產品有多個選擇列表。例如:如果產品是「褲子」,客戶應該能夠從選擇列表尺寸和另一個選擇列表顏色中進行選擇。

我有什麼
DB:

Table Products: Id|Name|Price|etc... 


Table: Properties: Id|Name|Value 


Table Product_properties: Id|Product_id|Property_1_id|Property_2_id|Supply 

爲了能夠與Laravel正確地訪問他們,我也創建了這些類延伸到侃侃而談。 我給自己定的類的關係如下所示:

產品:

public function productProperties() 
    { 
     return $this->hasMany('ProductProperty', 'product_id'); 
    } 

ProductProperty:

public function product() 
{ 
    return $this->belongsTo('Product'); 
} 

public function properties() 
{ 
    return $this->hasMany('Property', 'id'); 
} 

物業:

public function properties() 
{ 
    return $this->belomgsTo('ProductProperty'); 
} 

我的問題
這是否正確配置?我如何有效地將其納入選擇列表?

+0

有沒有任何機會可以修改您的模式或者您堅持使用您的模式?有一些可以使你的生活變得更容易的巨大改進。 – user3158900

+0

如有必要,我可以馬上改變它。我仍在設計。 – theAdmiral

回答

0

我修改了模式了一下,一個體面的解決方案上來。這看起來很混亂,但實際上很簡單。

每種類型的屬性應該有它自己的表,在這種情況下,尺寸和材料。這將使得添加其他類型的屬性變得非常容易,因爲您只需創建表格和模型,並且可以立即開始使用它,而無需對代碼進行其他更改。

class Size extends Eloquent { 

    public function properties() 
    { 
     return $this->morphMany('Property', 'imageable'); 
    } 

} 

class Material extends Eloquent { 

    public function properties() 
    { 
     return $this->morphMany('Property', 'imageable'); 
    } 

} 

要使所有屬性在一起,使它們更易於使用,我創建了一個名爲properties多態表,將存儲屬性本身在其表,它屬於類,Size的ID,或Material

class CreatePropertiesTable extends Migration { 

    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::create('properties', function($table) 
     { 
      $table->increments('id'); 
      $table->integer('imageable_id'); 
      $table->string('imageable_type'); 
     }); 
    } 
} 

此表將成爲2點而言,它顯然會充當常務我們與SizeMaterial模型多態性關係表,這將是與產品的許多一對多關係的一部分表(產品可以有許多屬性,屬性可以屬於許多產品)。這是該表的模型。

class Property extends Eloquent { 

    public function imageable() 
    { 
     return $this->morphTo(); 
    } 

    public function products() 
    { 
     return $this->belongsToMany('Product'); 
    } 

} 

最後,要完成我們的產品/財產關係,我們將有products表。

class CreateProductTable extends Migration { 

    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::create('products', function($table) 
     { 
      $table->increments('id'); 
      $table->string('name'); 
      $table->timestamps(); 
     }); 
    } 
} 

Product模型...

class Product extends Eloquent { 

    public function properties() 
    { 
     return $this->belongsToMany('Property'); 
    } 

} 

最後,對於產品/屬性許多一對多的關係表...

class CreatePropertyProductTable extends Migration { 

    /** 
    * Run the migrations. 
    * 
    * @return void 
    */ 
    public function up() 
    { 
     Schema::create('product_property', function($table) 
     { 
      $table->increments('id'); 
      $table->integer('product_id'); 
      $table->integer('property_id'); 
     }); 
    } 
} 

現在看來,這已經成爲非常容易回答你原來的問題。爲了得到大小,只需用Size模型...

$sizes = Size::all()->lists('id', 'name');

,對他們進入一個選擇列表,當您創建視圖,通過可變沿控制器或路由

return View::make('some.view')->with('sizes', $sizes);

並在視圖

{{ Form::select('size', $sizes, Input::old('size')) }}

要獲得所有屬性的某種產品,這是很容易太...

$product = Product::find(1); 
foreach($product->properties as $property) { 
    $property = $property->imageable; 
    $class = get_class($property); 
    echo $class; 
    echo ': '; 
    echo $property->name; 
    echo "<br />"; 
} 

你可能最終要限制可用的大小(或其他屬性,顏色/材質等)根據選擇哪種產品,在這種情況下,我建議添加一個額外的表來管理這些產品,這將對每個可能的產品/產品組合都有一行。因此,例如,一個product_size表格將爲每個可能的產品/尺寸組合設置一行。然後在填寫您的選擇值時查詢該關係$sizes = Product::find(1)->possibleSizes;

+0

所以爲了我的理解,爲了存儲剩餘的數量,我必須創建另一個表(除了你提到的那個表),它存儲'product_id',多個'property_id'和'supply_int'? 因爲真正重要的是,例如一個尺寸爲S的產品(黑色,白色),M(藍色黑色),L(黃色,橙色),XL(白色,黑色) ,黃色,橙色,藍色)。 – theAdmiral

+0

用不同的方式說這個:如何存儲大小和顏色組合的可用性?在建議的表格結構中,該表格是什麼樣的? – theAdmiral

相關問題