Laravel Eloquent Relation Query - 获取数据以及关系属性

时间:2018-04-26 15:20:58

标签: php laravel laravel-5 eloquent

我需要帮助来检索雄辩的关系数据。

让我说我有这种雄辩的关系:

型号&关系

公司
属性:(id,代码,名称,状态)
关系:

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

网站
属性:(id,company_id,代码,名称,状态)
关系:

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());

我的问题

实际上,获取我想要的数据的最佳方法是什么?有可能不使用循环并只使用Eloquent关系查询?谢谢。

1 个答案:

答案 0 :(得分:2)

您最好的选择是在Site型号上创建accessor

public function getCompanyNameAttribute()
{
    return optional($this->company)->name;
}

^ optional()助手是这样做的,如果网站没有公司,这不会引发错误。您可能不需要它,具体取决于您的数据库设置。

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

protected $appends = ['company_name'];

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

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

此外,如果您要隐藏company对象,则可以使用模型中的protected $hidden = ['company']执行此操作。