【问题标题】:LARAVEL | Many-To-Many Relationship Between Three Tables - saving data from two arrays拉拉维尔 |三个表之间的多对多关系 - 保存两个数组中的数据
【发布时间】:2019-12-10 11:47:00
【问题描述】:

我希望在 PHP/Laravel 和数据库设计方面具有高级经验的人能够指导我朝着正确的方向前进。 我有以下数据库关系,并拥有除数据透视表之外的所有模型。

Database model screenshot

我的问题是我无法将子类别与至少一个或多个(不一定是所有)供应商关联到一个项目。我想将这种记录保存到 project_subcategory 表中。我可以轻松地将其手动保存到数据库中,但是由于我从视图中的两个不同数组(子类别和供应商)中获取数据,因此很难将其正确保存到数据库中。

Example of data inserted in the project_subcategory pivot table

我知道 多对多 关系应该只在两个表之间,并且 Laravel 文档建议的 多对多多态 方法似乎是乍一看解决方案;但是,在尝试了这种方法之后,我认为它在我的情况下行不通,这就是我在这里问的原因——在花了很多时间试图解决这个问题并进行了大量研究之后。

同样,我需要做的就是将许多子类别和一个或多个供应商分配给一个项目。换句话说,一个项目可以有许多子类别分配给它,每个子类别可以有许多供应商分配给它。此供应商列表是从 subcategory_supplier 表生成的。

如果有什么不明白的地方或者我需要进一步解释,请告诉我。

任何帮助将不胜感激!

PS:View example of what I need to achieve

【问题讨论】:

  • 我认为project_subcategory和供应商之间的关系是不必要的。您可以通过子类别获取一个项目的所有供应商。
  • @suguspnk - 非常感谢您的评论。但这就是我最初开始的方式。项目和子类别之间的多对多关系 - 但我找不到将所选供应商与特定子类别相关联的方法。请问您对如何实现这一目标有什么建议吗?非常感谢您的反馈。
  • 我想验证一下,供应商有很多子类别吗?
  • 无论如何,要回答您的问题“但我找不到将所选供应商与特定子类别相关联的方法。”,您可以使用 subcategory_supplier 获取供应商和 V.V. 的子类别
  • @suguspnk 感谢您的 cmets Suguspnk。子类别可以有许多供应商。我知道我可以使用“subcategory_supplier”数据透视表轻松获取子类别的所有供应商。那根本不是我的问题。我面临的问题是我需要能够将子类别和特定供应商链接到项目。而且,每个项目可以有许多子类别,但并非所有链接到子类别的供应商都必须附加到该项目。它可以是一个或多个,但不是全部。

标签: php html mysql laravel


【解决方案1】:

我已设法找到解决问题的方法 - 因此,我的原始问题得到了解答。 我将在这里留下我为解决问题所做的工作,希望它可能对面临类似情况的人有所帮助。

我所做的不是尝试从两个不同的数组(子类别和供应商)插入,而是从视图中将它们组合成一个数组。 然后通过使用 foreach 循环,我提取了子类别 ID(键)和供应商 ID(值)。然后使用 Laravel 的“附加” 我插入到 project_subcategory 表中的方法。

//Insert records to the project_subcategory table.
        if ($request->subcategories_suppliers != null) {
            //dd($request->subcategories_suppliers);

            //The array containing the subcategories as the array key and the suppliers ids as the array value
            $array = $request->subcategories_suppliers;

            //Detach all records from project_subcategory before updating
            $project->subcategories()->detach();
            //Loop throuh $array to obtain the id for the subcategory and the array with all the suppliers ids
            foreach ($array as $subcategory => $suppliers) {
                //Loop through $suppliers to get each supplier's id
                foreach ($suppliers as $supplierID) {
                    //Attach values into the pivot table project_subcategory
                    $project->subcategories()->attach([$subcategory => ['supplier_supplierID' => $supplierID]]);
                }
            }

这是来自 html 刀片视图的一些代码:

 @foreach($subcategory->suppliers as $supplier)
                                        <div class="form-check d-none suppliers-list{{$subcategory->subcategoryID}}"
                                            id="">
                                            <input type="hidden" name="subcategory_name"
                                                value="{{$subcategory->subcategoryID}}" />
                                            <input class="form-check-input" type="checkbox"
                                                value="{{$supplier->supplierID}}"
                                                **name="subcategories_suppliers[{{$subcategory->subcategoryID}}][]"**
                                                @if(in_array($supplier->supplierID,
                                            old('subcategories_suppliers',
                                            $project->subcategories()->pluck('supplier_supplierID')->toArray())) && in_array($subcategory->subcategoryID, $project->subcategories()->pluck('subcategory_subcategoryID')->toArray()))
                                            checked
                                            @endif>
                                            <label class="form-check-label" for="defaultCheck1">
                                                <b>{{$supplier->supplier_name}}</b>
                                            </label>
                                        </div>
                                        @continue
                                        @endforeach

希望这可能对某人有所帮助!

【讨论】:

    猜你喜欢
    • 2018-03-06
    • 2015-04-13
    • 2016-02-06
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 2017-02-06
    相关资源
    最近更新 更多