Laravel 多对多关系在哪里保存项目总数? [关闭]

Posted

技术标签:

【中文标题】Laravel 多对多关系在哪里保存项目总数? [关闭]【英文标题】:Laravel ManyToMany relations where to save item total? [closed] 【发布时间】:2020-06-18 12:01:29 【问题描述】:

需要建议多对多关系的最佳做法是在哪里保存项目总计列? 例如。我有用户和库存表,它们通过数据透视表连接,在数据透视表中我也有附加库存的列总数。 这是正确的方法还是有人可以建议我哪种方法是最好的方法?

数据库结构

【问题讨论】:

尚不清楚用户和库存之间的关系。你能简单介绍一下这段关系吗? 例如我的任务:我有 10x 'A' 库存,我想从这 10 个中给用户 5x 'A',我必须在哪里保存这 5x 数量值?我认为在数据透视表中保存此库存 5 次将是不正确的解决方案。 【参考方案1】:

我可以建议:

1) 使这对外键唯一(user_idinventory_id)以防止重复

2) 为您的数据透视表制作一个单独的模型:App\InventoryUser

3) 使用updateOrCreate Laravel Elequent 函数

根据ElequentDocs

updateOrCreate 将更新现有模型或创建新模型(如果没有) 存在

例如

$oldTotal = InventoryUser::where(['user_id' => 'x', 'inventory_id' => 'y'])->select('total') ?? 0;
$inventoryUser = InventoryUser::updateOrCreate(
    ['user_id' => 'x', 'inventory_id' => 'y'],
    ['total' => $oldTotal+1]
);

甚至更好

$inventoryUser = InventoryUser::updateOrCreate(
        ['user_id' => 'x', 'inventory_id' => 'y']
)->increment('total'); // You must Set DEFAULT value to (0) for total column in your database

【讨论】:

在数据透视表中存储数据是否正确? 是的,没关系,这里看Laravel自己提供的例子laravel.com/docs/6.x/… 有没有办法从像foreach ($user->inventory as $item) $item->total; 这样的数据透视表中获取数据? 当然可以,但是请记住 many -- many 关系 == 1--many--1。换句话说,您可以在User Model 和InventoryUser Pivot Model 之间定义一对多的关系。然后您可以访问数据透视表,例如:$user->relationName->total 是的,但是该用户可能拥有超过 1 个相关库存。当我将建立一对多关系并调用 $user->relationName->total 时,它将返回许多库存。例如,我需要获取有多少(来自枢轴的列总数)x 库存有用户。

以上是关于Laravel 多对多关系在哪里保存项目总数? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 将数据保存到多对多关系

Laravel 上的多对多问题关系

如何在 Laravel 中从多对多关系的一对多关系中获取项目?

如何在 Laravel 5.5 中实现多个多对多关系?

Laravel eloquent 检查不存在的多对多关系

与同一张表的关系(多对多?) - Laravel