Laravel模型关系-我想建立什么样的关系?

时间:2019-07-04 08:41:38

标签: php laravel relationship

我有3个与此问题相关的模型;国家,制造商和地区。

出于这个问题,我简化了表格。我认为表格中的其他任何内容或其他任何模型都与问题无关。

我的表设置如下;

manufacturers
 - id
 - name

countries
 - id
 - name

regions
 - id
 - name
 - manufacturer_id
 - country_id

我想做的就是在刀片中写上$manufacturer->countries,让它吐出与给定制造商关联的国家/地区。

当前模型之间相互关联;

Country.php

public function manufacturers()
{
    return $this->hasMany(Manufacturer::class);
}

public function regions()
{
    return $this->hasMany(Region::class);
}

Region.php

public function manufacturer()
{
    return $this->belongsTo(Manufacturer::class);
}

public function country()
{
    return $this->belongsTo(Country::class);
}

还有问题所在,Manufacturer.php

我认为我需要hasMany关系。我已经有;

public function regions()
{
    return $this->hasMany(Region::class);
}

我本以为会需要;

public function countries()
{
    return $this->hasManyThrough(Country::class,Region::class);
}

但这会导致此错误;

Column not found: 1054 Unknown column 'countries.region_id' in 'on clause' (SQL: select `countries`.*, `regions`.`manufacturer_id` as `laravel_through_key` from `countries` inner join `regions` on `regions`.`id` = `countries`.`region_id` where `regions`.`manufacturer_id` = 4)

所以我尝试将类交换给;

public function countries()
{
    return $this->hasManyThrough(Region::class,Country::class);
}

但这导致;

Column not found: 1054 Unknown column 'countries.manufacturer_id' in 'field list' (SQL: select `regions`.*, `countries`.`manufacturer_id` as `laravel_through_key` from `regions` inner join `countries` on `countries`.`id` = `regions`.`country_id` where `countries`.`manufacturer_id` = 4)

有人知道我应该如何建立我的人际关系以实现我想要的吗?

我还尝试了一种belongsToMany关系,该关系确实带回了这些国家,但又带回了同一国家的多个实例。我只希望每个给定制造商的每个国家/地区出现在地区表中。

2 个答案:

答案 0 :(得分:0)

您实际上正在处理多对多关系。

在您的情况下,regions是数据透视表。

请检查是否属于ManyTo

答案 1 :(得分:0)

Laravel中,最适用的关系是many to many关系。这对您的情况意味着1 country可以有多个manufacturers,而1 manufacturer可以在多个国家。

如果是这种情况,则无需创建regions表,而是创建pivot table. laravel的默认命名约定是(单数和全字母顺序),即, country_manufacturer表,它将包含(您可以随时添加一个额外的变量,称为pivot值):

country_manufacturer
  - id
  - name // pivot value
  - manufacturer_id
  - country_id

然后,在模型中添加belongsToMany关系,即

在制造商模型中(无枢轴):

public function countries()
{
   return $this->belongsToMany(Manufacturer::class);
}

在国家/地区模型中(带支点):

public function manufacturers()
{
   return $this->belongsToMany(Country::class)->withPivot('name');
}

因此,您将可以致电$country->manufacturers(),这将为您提供$country中所有制造商的列表,反之亦然:$manufacturer->countries将为您提供所有国家/地区制造商的所在地。