【问题标题】:Laravel "Three-Way" Pivot Table?Laravel“三向”数据透视表?
【发布时间】:2016-02-03 11:34:34
【问题描述】:

操作:

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

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

..等等。

然后它就变得棘手了,至少对我来说。到目前为止,我一直在使用上述方法制作一份简单的购物清单。但现在我想添加另一个名为“Groceries”的表,我在其中存储杂货清单。像这样:

Groceries
- id
- name

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

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

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

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

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

$groceries = Grocery::find($id)->with('categories')->with('products'); ?

我个人的想法是,我 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');
}

模型产品:

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

模型杂货:

// No relations yet

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

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

Category Alcohol
- [ ] Beer
- [ ] Wine
- [ ] Whisky

Category Bread
- [ ] Brown Bread
- [ ] White Bread

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

然后,在编辑表单上,我想显示相同的视图,但已选择保存的产品。所以,我认为实现这一点的最佳方法是将杂货店 ID 存储在数据透视表中,并且它是选定的产品。然后,在编辑表单上,我只需检查产品 ID 是否存在,如果存在,则应选中复选框。但是我对关系应该是什么样子以及我实际上应该存储在我的数据透视表中的内容感到困惑,正如我所说的产品 ID 或者我什至不应该使用数据透视表?

【问题讨论】:

  • 在您的案例中,杂货清单是什么? User ID 1 has: One wine, two beers, one cheese - 是不是这样?
  • 解释 Grocery 与类别和/或产品的关系。
  • 请提供类别、杂货和产品之间的关系..
  • 抱歉,加在上面
  • @Kaloyan Doichinov。一个用户可以有多个购物清单。杂货清单仅由产品清单组成。但我认为我确实需要在 OP 中详细说明这一点。会做的:)

标签: laravel pivot relation


【解决方案1】:

下面是我的做法:

  1. 一个产品belongsTo一个类别,在你的情况下。
  2. 因此,类别hasMany 产品。
  3. 用户hasMany“杂货清单”,每个hasMany产品
  4. 所以一个列表也是belongsTo一个特定的用户
  5. 因此,产品也会belongsToMany 列出

这免除了您必须执行 3 向枢轴的麻烦,并且 Eloquent 将让您在填充描述中的复选框列表时方便地浏览您可能需要的任何模型的任何和所有关系。 这里有一个 simple schema 作为示例 - 可能需要一些调整!

然而,我更喜欢 Query Builder 或普通的原始 DB 查询,而不是像这样的复杂 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

【讨论】:

  • 谢谢,虽然 3 号和 5 号是我不确定的。但是现在你这样说,实际上它是完全有道理的。现在是时候尝试把我的头包裹起来了:D
猜你喜欢
  • 2018-04-20
  • 2018-05-02
  • 2018-04-10
  • 2016-09-04
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多