Laravel“三向”转轴表?

时间:2016-02-03 11:34:34

标签: laravel pivot relation

OP:

我的网站上有一个名为“Groceries”的页面。为此,我使用两个表:

<Button Content="Click me!" Command="{Binding LoginCommand}"/> 

简单的东西。在我的查询中,我使用相应的产品收集所有类别。 Categories [$this->hasMany('App\Product')] - id - name Products [$this->belongsTo('App\Category')] - id - category_id - name

然后在我看来,我可以使用他们的产品访问所有类别并很好地列出,所有类别将显示一次,类​​别名称下面将是我的产品。都好。例如:

groceries = Category::with('products')->get();

..等等。

然后它变得棘手,至少对我而言。直到现在我一直在使用上述方法用于一个简单的购物清单。但现在我想添加另一个名为“Groceries”的表,我在其中存储了购物清单。像这样:

Category Alcohol
- Beer
- Wine
- Whisky

Category Bread
- Brown Bread
- White Bread

有了这个,我认为数据透视表会派上用场,但我不确定在数据透视表中存储什么以及如何访问所有数据:

Groceries
- id
- name

我一直很难理解一个“简单”的数据透视表,现在它变得更加棘手,有一个“三向”数据透视表。

我希望将以下内容存储在我的数据透视表中:

购物清单的杂货店ID。但后来我卡住了。我还应该在数据透视表中存储什么,以便我能够继续使用上述方法,但后来还有一个额外的参数,如下所示:

category_product?
grocery_product?
- id
- grocery_id
- product_id?
- category_id? I don't think I need to store this in the pivot table, it can be accessed through the Products model?
- number

我个人在想的是,$groceries = Grocery::find($id)->with('categories')->with('products'); ? 在我的Groceries模型中使用以下关系?:

should

任何正确方向的指示都可以帮助我确定正确的方向,这已经有所帮助了。

编辑:

模特用户:

public function categories()
{
    return $this->hasMany('App\Category')->with('App\Product');
}

模特类别:

public function groceries()
{
    return $this->hasMany('App\Grocery');
}

模型产品:

public function products()
{
    return $this->hasMany('App\Product');
}

Model Groceries:

public function category()
{
    return $this->belongsTo('App\Category');
}

编辑#2: 在我的groceries.index页面上,我有一个简单的当前登录用户的购物清单列表。他们可以创建,编辑或删除购物清单。

一旦用户点击“创建杂货列表”,我会显示包含所有类别及其相应产品的视图,如下所示:

// No relations yet

[]代表一个复选框。用户可以选择他或她想要添加到列表中的产品。保存后,我想将购物清单ID存储在数据透视表中,其中包含已选择的产品ID。

然后,在编辑表单上,我想显示相同的视图,但已经选择了已保存的产品。因此,我认为实现此目的的最佳方法是将数据库ID存储在数据透视表中,并将其选定为产品。然后,在编辑表单上,我只是检查产品ID是否存在,如果存在,则应选中复选框。但我仍然坚持关系应该如何以及我实际上应该存储在我的数据透视表中,产品ID就像我说的那样,或者我甚至不应该使用数据透视表?

1 个答案:

答案 0 :(得分:1)

以下是我的意思:

  1. 产品belongsTo类别,在您的情况下。
  2. 因此,类别hasMany产品。
  3. 用户hasMany“购物清单”,其中每个hasMany商品
  4. 所以列表也是belongsTo一个特定用户
  5. 因此,产品还会belongsToMany列出
  6. 这使您无需进行三向旋转,Eloquent将让您方便地遍历描述中填充复选框列表时可能需要的任何模型的任何和所有关系。 这是一个simple schema作为例子 - 可能需要一些调整!

    但是,我会更喜欢查询生成器或普通原始数据库查询而不是像这些复杂JOIN的Eloquent方法,因为Laravel中的关系生成器实际上执行WHERE id IN (1, 2, 3),这在性能方面有点差与常规联接相比。请参阅以下参考:

    https://laravel.com/docs/5.0/queries#raw-expressions

    https://laravel.com/docs/5.1/queries#joins