我希望有PHP / Laravel和数据库设计方面的高级经验的人可以以此指导我正确的方向。我具有以下数据库关系,并且具有除数据透视表以外的所有模型。
数据库模型截图
我的问题是我无法将子类别及其供应商与项目相关联。我想将其保存到project_subcategory表中,但是由于我要从两个不同的数组(子类别和供应商)中获取数据,因此很难将其正确保存到数据库中。
我知道多对多关系应该只在两个表之间,many-to-many多态方法似乎可以解决这个问题。但是,在尝试了这种方法之后,我认为我不适合我的情况,这就是为什么我要花很多时间解决这个问题之后才在这里提出问题。
我需要做的就是为一个项目分配许多子类别和许多FOR EACH子类别的供应商。换句话说,一个项目可以分配有许多子类别,每个子类别可以分配有许多供应商。
如果有什么不对劲的地方,或者我需要进一步解释,请告诉我。
任何帮助都感激不尽!
PS:查看我需要实现的示例
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据你的描述,你希望在项目(Project)与子类别(Subcategory)以及子类别与其供应商(Supplier)之间建立多对多关系。同时,每个项目可以关联多个子类别,并且每个子类别又可以关联多个供应商。这种情况下,确实需要使用多对多关系,但因为涉及到三个实体,所以需要两个关联表来正确建模。
project_id
和 subcategory_id
字段。subcategory_id
和 supplier_id
字段。use Illuminate\Database\Eloquent\Model;
class Project extends Model
{
public function subcategories()
{
return $this->belongsToMany(Subcategory::class, 'project_subcategories');
}
}
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');
}
}
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();
通过上述方法,你可以实现一个项目关联多个子类别,每个子类别再关联多个供应商的需求。确保在执行之前已经设置了正确的数据库迁移文件以创建必要的表结构。