产品的第二个属性选择列表 - Laravel Relations

时间:2014-02-21 12:24:14

标签: database laravel relationships selectlist

我现在在这个问题上工作了一段时间,但我似乎没有得到理想的解决方案。

我正在开设一个带有产品的网上商店。这些产品可包含不同尺寸,颜色或/和材料。

我想要的是什么:
具有多个选择列表的产品。例如:如果产品是“裤子”,则客户应该能够从选择列表大小和其他选择列表颜色中进行选择。

我有什么
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');
}

我的问题
这是否正确配置?如何将它们有效地纳入选择列表?

1 个答案:

答案 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

时查询该关系