我有以下雄辩的关系
农场-
/**
* \App\Address associated to the current farm.
*
* @return \App\Address
*/
public function address()
{
return $this->hasOne('\App\Address');
}
...然后地址-
public function country()
{
return $this->belongsTo('\App\Country','country_id','id');
}
... 我想检索国家模型,并使用地址表上的国家id获取所有相关农场。我对hasManyThrough的定义如下:
/**
* Get all of the farms for the country.
*/
public function farms()
{
return $this->hasManyThrough('App\Farm', 'App\Address');
}
但它会生成以下SQL:
select
`farms`.*,
`addresses`.`country_id`
from `farms`
inner join `addresses` on `addresses`.`id` = `farms`.`address_id`
where `addresses`.`country_id` = 1
SQL正在farms表中查找地址\u id。但是农场没有“属于”一个地址。是否有任何方法可以纠正这一点,或者我是否需要更改我的模式?
非常感谢。
要使其正常工作,您需要反转场地址关系的方向:
class Farm extends Model {
public function address() {
return $this->belongsTo(Address::class);
}
}
原因是Elount假设hasManyThrough关系中的每个“节点”都是下一个节点的父节点,这意味着下一个节点属于上一个节点。在这里,如果您想通过给定国家的地址获取农场,农场需要通过地址\ id指向地址,地址需要通过国家\ id指向国家。