我有以下雄辩的关系
农场 - > hasOne - >地址如下:
/**
* \App\Address associated to the current farm.
*
* @return \App\Address
*/
public function address()
{
return $this->hasOne('\App\Address');
}
...然后地址 - > belongsTo - >国家如下:
public function country()
{
return $this->belongsTo('\App\Country','country_id','id');
}
...我想要检索Country模型并使用地址表上的country_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正在寻找farm表上的address_id。但是农场不属于#34;一个地址。无论如何要纠正这个问题,还是我需要更改我的架构?
非常感谢。
答案 0 :(得分:0)
为了实现这一目标,您需要改变Farm-Address关系的方向:
class Farm extends Model {
public function address() {
return $this->belongsTo(Address::class);
}
}
原因是Eloquent假设每个"节点" in hasManyThrough关系是下一个节点的父类,意味着下一个节点属于前一个节点。在这里,如果您希望通过地址获取给定国家/地区的农场,则需要通过address_id指向地址,并且地址需要通过country_id指向国家/地区。