首页 文章

Laravel“三向”转轴表?

提问于
浏览
0

OP:

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

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'); ?

我个人在想的是,我在我的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页面上,我有一个简单的当前登录用户的购物清单列表 . 他们可以创建,编辑或删除购物清单 .

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

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

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

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

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

1 回答

  • 1

    这是我如何去做的:

    • 一个产品 belongsTo 一个类别,在您的情况下 .

    • 因此,类别 hasMany 产品 .

    • 用户 hasMany "grocery lists",其中每一个 hasMany 产品

    • 所以一个List也是 belongsTo 一个特定的用户

    • 因此,产品也将列出 belongsToMany

    这样可以省去必须进行三向旋转的麻烦,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

相关问题