laravel hasManyThrough属于belongsTo关系

时间:2015-07-13 16:19:38

标签: php laravel laravel-5 eloquent

我有以下雄辩的关系

农场 - > 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;一个地址。无论如何要纠正这个问题,还是我需要更改我的架构?

非常感谢。

1 个答案:

答案 0 :(得分:0)

为了实现这一目标,您需要改变Farm-Address关系的方向:

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

原因是Eloquent假设每个"节点" in hasManyThrough关系是下一个节点的父类,意味着下一个节点属于前一个节点。在这里,如果您希望通过地址获取给定国家/地区的农场,则需要通过address_id指向地址,并且地址需要通过country_id指向国家/地区。