Laravel "Three-Way" 枢轴 Table?
Laravel "Three-Way" Pivot Table?
OP:
我的网站上有一个名为 "Groceries" 的页面。为此,我使用了两个 tables:
Categories [$this->hasMany('App\Product')]
- id
- name
Products [$this->belongsTo('App\Category')]
- id
- category_id
- name
简单的东西。在我的查询中,我收集了所有类别及其相应的产品。 groceries = Category::with('products')->get();
然后在我看来我可以访问所有类别及其产品并很好地列出它们,所有类别将显示一次,类别名称下方将是我的产品。都好。示例:
Category Alcohol
- Beer
- Wine
- Whisky
Category Bread
- Brown Bread
- White Bread
..等等
然后这就是它变得棘手的地方,至少对我而言。到目前为止,我一直在将上述方法用于一个简单的购物清单。但现在我想添加另一个 table,称为 "Groceries",我在其中存储购物清单。像这样:
Groceries
- id
- name
有了这个,我认为枢轴 table 会派上用场,但我不确定要在枢轴 table 中存储什么以及如何访问所有数据:
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
我一直很难理解 "simple" 支点 table,现在它变得更加棘手,有 "three-way" 支点 table。
我希望在我的数据透视表中存储以下内容 table:
杂货清单的杂货 ID。但后来我卡住了。我还应该在 pivot table 中存储什么,以便我仍然能够继续使用上述方法,但随后需要一个额外的参数,如下所示:
$groceries = Grocery::find($id)->with('categories')->with('products'); ?
我个人的想法是 should
在我的 Groceries 模型中使用以下关系吗?:
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');
}
型号产品:
public function category()
{
return $this->belongsTo('App\Category');
}
模特杂货店:
// No relations yet
编辑#2:
在我的 groceries.index 页面上,我有一个简单的当前登录用户的杂货清单列表。他们可以创建、编辑或删除购物清单。
一旦用户点击 "Create Grocery List",我会显示一个包含所有类别及其相应产品的视图,如下所示:
Category Alcohol
- [ ] Beer
- [ ] Wine
- [ ] Whisky
Category Bread
- [ ] Brown Bread
- [ ] White Bread
[ ] 代表复选框。用户可以 select 他或她想要将哪些产品添加到列表中。保存后,我想将杂货清单 ID 存储在枢轴 table 中,其中产品 ID 为 selected.
然后,在编辑表单上,我想显示相同的视图,但保存的产品已经 selected。因此,我认为实现此目的的最佳方法是将杂货店 ID 存储在数据透视表 table 中,它是 selected 产品。然后,在编辑表单上,我只是检查产品 ID 是否存在,如果存在,则应选中该复选框。但我仍然坚持关系应该是什么样子以及我实际上应该存储在我的枢轴 table 中的内容,如我所说的产品 ID 或者我根本不应该使用枢轴 table 吗?
以下是我的处理方式:
- 一个产品
belongsTo
一个类别,在你的例子中。
- 因此,类别
hasMany
产品。
- 用户
hasMany
"grocery lists",每个hasMany
个产品
- 所以一个列表也
belongsTo
一个特定的用户
- 因此,产品也会
belongsToMany
列出
这使您免去了必须进行三向转换的麻烦,并且 Eloquent 可以让您方便地遍历填充复选框列表时可能需要的任何模型的所有关系在你的描述中。
这是一个 simple schema 作为示例 - 可能需要一些调整!
但是,对于像这样的复杂 JOIN,我更喜欢查询生成器或纯原始数据库查询而不是 Eloquent 方法,因为 Laravel 中的关系生成器实际上做了一个 WHERE id IN (1, 2, 3)
,与常规连接相比,这在性能方面有点差。请参阅这些以供参考:
OP:
我的网站上有一个名为 "Groceries" 的页面。为此,我使用了两个 tables:
Categories [$this->hasMany('App\Product')]
- id
- name
Products [$this->belongsTo('App\Category')]
- id
- category_id
- name
简单的东西。在我的查询中,我收集了所有类别及其相应的产品。 groceries = Category::with('products')->get();
然后在我看来我可以访问所有类别及其产品并很好地列出它们,所有类别将显示一次,类别名称下方将是我的产品。都好。示例:
Category Alcohol
- Beer
- Wine
- Whisky
Category Bread
- Brown Bread
- White Bread
..等等
然后这就是它变得棘手的地方,至少对我而言。到目前为止,我一直在将上述方法用于一个简单的购物清单。但现在我想添加另一个 table,称为 "Groceries",我在其中存储购物清单。像这样:
Groceries
- id
- name
有了这个,我认为枢轴 table 会派上用场,但我不确定要在枢轴 table 中存储什么以及如何访问所有数据:
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
我一直很难理解 "simple" 支点 table,现在它变得更加棘手,有 "three-way" 支点 table。
我希望在我的数据透视表中存储以下内容 table:
杂货清单的杂货 ID。但后来我卡住了。我还应该在 pivot table 中存储什么,以便我仍然能够继续使用上述方法,但随后需要一个额外的参数,如下所示:
$groceries = Grocery::find($id)->with('categories')->with('products'); ?
我个人的想法是 should
在我的 Groceries 模型中使用以下关系吗?:
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');
}
型号产品:
public function category()
{
return $this->belongsTo('App\Category');
}
模特杂货店:
// No relations yet
编辑#2: 在我的 groceries.index 页面上,我有一个简单的当前登录用户的杂货清单列表。他们可以创建、编辑或删除购物清单。
一旦用户点击 "Create Grocery List",我会显示一个包含所有类别及其相应产品的视图,如下所示:
Category Alcohol
- [ ] Beer
- [ ] Wine
- [ ] Whisky
Category Bread
- [ ] Brown Bread
- [ ] White Bread
[ ] 代表复选框。用户可以 select 他或她想要将哪些产品添加到列表中。保存后,我想将杂货清单 ID 存储在枢轴 table 中,其中产品 ID 为 selected.
然后,在编辑表单上,我想显示相同的视图,但保存的产品已经 selected。因此,我认为实现此目的的最佳方法是将杂货店 ID 存储在数据透视表 table 中,它是 selected 产品。然后,在编辑表单上,我只是检查产品 ID 是否存在,如果存在,则应选中该复选框。但我仍然坚持关系应该是什么样子以及我实际上应该存储在我的枢轴 table 中的内容,如我所说的产品 ID 或者我根本不应该使用枢轴 table 吗?
以下是我的处理方式:
- 一个产品
belongsTo
一个类别,在你的例子中。 - 因此,类别
hasMany
产品。 - 用户
hasMany
"grocery lists",每个hasMany
个产品 - 所以一个列表也
belongsTo
一个特定的用户 - 因此,产品也会
belongsToMany
列出
这使您免去了必须进行三向转换的麻烦,并且 Eloquent 可以让您方便地遍历填充复选框列表时可能需要的任何模型的所有关系在你的描述中。 这是一个 simple schema 作为示例 - 可能需要一些调整!
但是,对于像这样的复杂 JOIN,我更喜欢查询生成器或纯原始数据库查询而不是 Eloquent 方法,因为 Laravel 中的关系生成器实际上做了一个 WHERE id IN (1, 2, 3)
,与常规连接相比,这在性能方面有点差。请参阅这些以供参考: