我现在在这个问题上工作了一段时间,但我似乎没有得到理想的解决方案。
我正在开设一个带有产品的网上商店。这些产品可包含不同尺寸,颜色或/和材料。
我想要的是什么:
具有多个选择列表的产品。例如:如果产品是“裤子”,则客户应该能够从选择列表大小和其他选择列表颜色中进行选择。
我有什么
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正确访问它们,我还创建了这些扩展为eloquent的类。 我已经在类中设置关系如下:
产品:
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 :(得分: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
的多态表,它将属性本身的id存储在其表及其所属的类中,{{ 1}}或Size
。
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');
});
}
}
和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