Php Laravel雄辩的关系查询-获取数据和关系属性

Php Laravel雄辩的关系查询-获取数据和关系属性,php,laravel,laravel-5,eloquent,Php,Laravel,Laravel 5,Eloquent,我需要帮助检索有说服力的关系数据 假设我有这样一种雄辩的关系: 模型与关系 公司 属性:(id、代码、名称、状态) 关系: public function sites(){ $this->hasMany(\App\Models\Site::class); } public function company(){ $this->belongsTo(\App\Models\Company::class); } 站点 属性:(id、公司id、代码、名称、状态) 关系: p

我需要帮助检索有说服力的关系数据

假设我有这样一种雄辩的关系:

模型与关系 公司
属性:(id、代码、名称、状态)
关系:

public function sites(){
   $this->hasMany(\App\Models\Site::class);
}
public function company(){
    $this->belongsTo(\App\Models\Company::class);
}
站点
属性:(id、公司id、代码、名称、状态)
关系:

public function sites(){
   $this->hasMany(\App\Models\Site::class);
}
public function company(){
    $this->belongsTo(\App\Models\Company::class);
}

我想找回什么 我希望检索所有站点数据及其公司名称,例如:

[
   {
      "id":7,
      "company_id":1,
      "company_name":"Company 1",
      "code":"S001",
      "name":"Site 001",
      "status":"Active"
   },
   {
      "id":8,
      "company_id":1,
      "company_name":"Company 1",
      "code":"S002",
      "name":"Site 002",
      "status":"Active"
   }
]

我已经试过了 1-我已经尝试过这种方法:

$sites = Site::with('company')->get();
dd($sites->toJson());
但它给了我:

[
   {
      "id":7,
      "company_id":1,
      "code":"S001",
      "name":"Site 001",
      "status":"Active",
      "company":{
         "id":1,
         "code":"C001",
         "name":"Company 1",
         "status":"Active"
      }
   },
   {
      "id":8,
      "company_id":1,
      "code":"S002",
      "name":"Site 002",
      "status":"Active",
      "company":{
         "id":1,
         "code":"C001",
         "name":"Company 1",
         "status":"Active"
      }
   },
]
2-目前,我使用这种方法获取数据。但我认为还有另一种最好的方法,不用循环整个数据,只需获得一些特定的关系属性:

$sites = Site::get();
foreach ($sites as $site){
    $site['company_name'] = $site->company()->first()->name;
}
dd($sites->toJson());
我的问题
实际上,如何获得我想要的数据是最好的方法?是否可以不使用循环而只使用雄辩的关系查询?多谢各位

您最好的选择是在
网站上创建一个
模型:

public function getCompanyNameAttribute()
{
    return optional($this->company)->name;
}
^
optional()
helper使之成为这样,如果站点没有公司,则不会引发错误。根据您的数据库设置,您可能不需要它

然后,您可以将访问器添加到模型中的数组中,以便它在JSON转储中可见:

protected$appends=['company_name']

我还建议您每次都向公司加载站点,就像您在第一个示例中所做的那样,以避免
n+1

Site::with('company')->get()

此外,如果要隐藏
公司
对象,可以在模型中使用