提问者:小点点

拉威尔对一段属于自己的感情有很多想法


我有以下雄辩的关系

农场-

/**
 * \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。但是农场没有“属于”一个地址。是否有任何方法可以纠正这一点,或者我是否需要更改我的模式?

非常感谢。


共1个答案

匿名用户

要使其正常工作,您需要反转场地址关系的方向:

class Farm extends Model {
  public function address() {
    return $this->belongsTo(Address::class);
  }
}

原因是Elount假设hasManyThrough关系中的每个“节点”都是下一个节点的父节点,这意味着下一个节点属于上一个节点。在这里,如果您想通过给定国家的地址获取农场,农场需要通过地址\ id指向地址,地址需要通过国家\ id指向国家。