开发者社区 问答 正文

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

我希望有PHP / Laravel和数据库设计方面的高级经验的人可以以此指导我正确的方向。我具有以下数据库关系,并且具有除数据透视表以外的所有模型。

数据库模型截图

我的问题是我无法将子类别及其供应商与项目相关联。我想将其保存到project_subcategory表中,但是由于我要从两个不同的数组(子类别和供应商)中获取数据,因此很难将其正确保存到数据库中。

我知道多对多关系应该只在两个表之间,many-to-many多态方法似乎可以解决这个问题。但是,在尝试了这种方法之后,我认为我不适合我的情况,这就是为什么我要花很多时间解决这个问题之后才在这里提出问题。

我需要做的就是为一个项目分配许多子类别和许多FOR EACH子类别的供应商。换句话说,一个项目可以分配有许多子类别,每个子类别可以分配有许多供应商。

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

任何帮助都感激不尽!

PS:查看我需要实现的示例

展开
收起
社区秘书 2019-12-09 16:04:11 890 分享 版权
阿里云 AI 助理回答

根据你的描述,你希望在项目(Project)与子类别(Subcategory)以及子类别与其供应商(Supplier)之间建立多对多关系。同时,每个项目可以关联多个子类别,并且每个子类别又可以关联多个供应商。这种情况下,确实需要使用多对多关系,但因为涉及到三个实体,所以需要两个关联表来正确建模。

数据库设计建议

  1. projects 表:存储项目信息。
  2. subcategories 表:存储子类别信息。
  3. suppliers 表:存储供应商信息。
  4. project_subcategories 表:作为项目与子类别的关联表,包含 project_idsubcategory_id 字段。
  5. subcategory_suppliers 表:作为子类别与供应商的关联表,包含 subcategory_idsupplier_id 字段。

Laravel 模型设置

项目模型 (Project.php)

use Illuminate\Database\Eloquent\Model;

class Project extends Model
{
    public function subcategories()
    {
        return $this->belongsToMany(Subcategory::class, 'project_subcategories');
    }
}

子类别模型 (Subcategory.php)

use Illuminate\Database\Eloquent\Model;

class Subcategory extends Model
{
    public function projects()
    {
        return $this->belongsToMany(Project::class, 'project_subcategories');
    }

    public function suppliers()
    {
        return $this->belongsToMany(Supplier::class, 'subcategory_suppliers');
    }
}

供应商模型 (Supplier.php)

use Illuminate\Database\Eloquent\Model;

class Supplier extends Model
{
    public function subcategories()
    {
        return $this->belongsToMany(Subcategory::class, 'subcategory_suppliers');
    }
}

关联数据保存示例

假设你已经获取到了项目ID、一组子类别ID和这些子类别对应的供应商ID数组,你可以这样保存数据:

// 假设 $projectId 是当前项目的ID
$projectId = 1;
$subcategoriesIds = [/* 子类别ID数组 */];
$suppliersBySubcategoryId = [/* 子类别ID到其供应商ID数组的映射 */];

// 创建或获取项目实例
$project = Project::find($projectId);

// 遍历子类别并分配给项目
foreach ($subcategoriesIds as $subcategoryId) {
    // 为项目分配子类别
    $project->subcategories()->attach($subcategoryId);
    
    // 获取或创建子类别实例
    $subcategory = Subcategory::find($subcategoryId);
    
    // 如果有特定于该子类别的供应商,也进行关联
    if (isset($suppliersBySubcategoryId[$subcategoryId])) {
        $suppliersIds = $suppliersBySubcategoryId[$subcategoryId];
        $subcategory->suppliers()->attach($suppliersIds);
    }
}

// 最后别忘了保存项目实例,虽然在 attach 方法中会自动处理关联表的插入
$project->save();

通过上述方法,你可以实现一个项目关联多个子类别,每个子类别再关联多个供应商的需求。确保在执行之前已经设置了正确的数据库迁移文件以创建必要的表结构。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: