Laravel的正确关系

时间:2016-09-16 16:40:45

标签: php laravel

hello,对不起我的英语。我会尝试解释我的问题。

例如,我们有模型Product

每种产品都有一些选择:

product_1 : option_1 = 50, option_2 = 14, option_3 = 23

什么是正确的方法?

首先 - 创建数据库,如

id | title | option_1 | option_2 | option_3

第二 - 创建模型和表格,例如

ProductModel hasMany optionModel 
OptionModel belongsToMany ProductModel

tables in databases: Product, Option, Product_Option_Relationships

第三 - 在函数和表Product_Option_Relationships中创建一些集合,如

$options = collect([
  ['id' => '1', 'name' =>'option1'],
  ['id' => '2', 'name' =>'option2'],  
]);

表:id | product_id | option_id

或者也许存在正常的方式,因为首先 - 它太大的表,当你有20个选项,第二个 - 仅为信息功能创建新模型,我现在不,它正常吗?第三 - 在视图中显示选项名称太难了。

谢谢,我希望你能理解我。

3 个答案:

答案 0 :(得分:1)

通常使用一对多,多对多关系 这样做的好处是,您可以自由编辑任何记录而无需修改整个列以将其应用于您的表格:
首先,我们有products表,这将需要foreach选项 因此,我们应该将表格options放在一起,然后我们会添加一个新表格assignOptionsToProducts,其中包含options和& products在这种情况下,您可以根据自己的喜好设置多对多或一对多的关系

Products Table 
id | Name 
1  | Product A
2  | Product B

Options Table
id | Name 
1  | Option A
2  | Option B 

AssignOptionsToProducts Table 
id | Product_id | Option_id
1  | 1          | 1
2  | 1          | 2
3  | 2          | 2

如您所见,我们多次分配了相同的选项 当我们想要修改任何选项时你可以不修改其他表中的每个记录,当然你可以轻松地多次使用每个表

答案 1 :(得分:0)

使用第二种方式。你不会有重复的选择。例如:

产品

id | name
---|------
1  | Car
2  | Bike

选项

id   |  name
-----|------------
1    |  Transport

option_product

option_id   |  product_id
------------|-------------
1           |  1
1           |  2

使用其他方式,您可以选择传输两次。

答案 2 :(得分:0)

您可以使用多对多关系,并且可以像这样构建它:

产品型号

class Product extends Model {
    ...

    public function options() {
        return $this->belongsToMany('App\Product', 'product_options', 'product_id', 'option_id');
    }
}

选项模型

class Option extends Model {
    ...

    public function product() {
        return $this->belongsToMany('App\Option', 'product_options', 'option_id', 'product_id');
    }
}

您需要三个表才能实现此目的:

Table products

id | name
-----------------
 1 | iBeacon
 2 | Intel Edison

Table options

id | name  
----------
 1 | Price 
 2 | Size

Table product_options 

id | option_id | product_id
---------------------------
 1 |     1     |     2
 2 |     2     |     2

您可以选择是否要在选项表或数据透视表中存储带有选项值的记录。我将它们放在数据透视表中以使选项表更小。

现在,您可以为您的产品分配选项,如下所示:

...
// Assing options to a product
$product->options()->sync([$optionID, $optionID]);

// Get product's options
$product->options;

// Get products having certain option
$option->products;
...