【问题标题】:laravel hasManyThrough on a belongsTo relationshiplaravel hasManyThrough on a belongsTo 关系
【发布时间】:2023-03-08 18:21:02
【问题描述】:

我有以下 Eloquent 关系,其中

Farm -> hasOne -> 地址如下:

/**
 * \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');
}

...我想检索 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 正在农场表中查找 address_id。但是农场不“属于”一个地址。无论如何要纠正这个问题还是我需要更改我的架构?

非常感谢。

【问题讨论】:

  • 请告诉我们生成的sql的模型和来源。
  • 更新了问题以包括模型关系,在底部生成 SQL。感谢您的帮助。

标签: php laravel laravel-5 eloquent


【解决方案1】:

为了使其工作,您需要反转 Farm-Address 关系的方向:

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

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

【讨论】:

    猜你喜欢
    • 2020-02-02
    • 2018-03-08
    • 1970-01-01
    • 2017-11-12
    • 2018-10-18
    • 2023-03-09
    • 2018-07-24
    • 2020-10-14
    • 1970-01-01
    相关资源
    最近更新 更多