我修改了模式了一下,一個體面的解決方案上來。這看起來很混亂,但實際上很簡單。
每種類型的屬性應該有它自己的表,在這種情況下,尺寸和材料。這將使得添加其他類型的屬性變得非常容易,因爲您只需創建表格和模型,並且可以立即開始使用它,而無需對代碼進行其他更改。
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點而言,它顯然會充當常務我們與Size
和Material
模型多態性關係表,這將是與產品的許多一對多關係的一部分表(產品可以有許多屬性,屬性可以屬於許多產品)。這是該表的模型。
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;
有沒有任何機會可以修改您的模式或者您堅持使用您的模式?有一些可以使你的生活變得更容易的巨大改進。 – user3158900
如有必要,我可以馬上改變它。我仍在設計。 – theAdmiral