LARAVEL |三个表之间的多对多关系-保存两个数组中的数据

时间:2019-12-09 05:08:41

标签: php html mysql laravel

我希望有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

1 个答案:

答案 0 :(得分:0)

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

我所做的是不是试图从两个不同的数组(子类别和供应商)中插入,而是从视图中将它们组合到单个数组中。 然后,通过使用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

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