我有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
关系,该关系确实带回了这些国家,但又带回了同一国家的多个实例。我只希望每个给定制造商的每个国家/地区出现在地区表中。
答案 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
将为您提供所有国家/地区制造商的所在地。