Laravel雄辩的获取关系字段

时间:2018-08-07 18:39:44

标签: php laravel eloquent laravel-5.5

我需要从雄辩的对象中的关系中获取一个字段。

我正在使用数据表来传递雄辩的对象以供查看。

我有一个称为Offices的模型和一个名为Regions的模型

办公室 ID 名称 地区->属于地区

地区 ID 名称

我需要得到这样的东西: Offices.id,Offices.name,Regions.name

我尝试了以下操作,但失败了,如何在get方法中获取区域名称?

$ReportData = Offices::with('region')->get(['id', 'name', 'region.name']);
return datatables()->eloquent($ReportData)

2 个答案:

答案 0 :(得分:2)

口才关系不使用联接,因此您无法在Offices查询中选择它们。

$ReportData = Offices::with('region')->get(['id', 'name']);

将执行一个单独的查询以渴望加载所有区域,同时允许您将每个项目的相关区域作为属性进行访问:

$ReportData[0]->region->name

如果需要,您可以展平,使用地图或对带有类似Tim的联接的查询进行使用。

您可以通过使用闭包来限制从数据库中选择的区域数据:

$ReportData = Offices::with(['region' => function($q) {
    $q->select('name');
})->get(['id', 'name']);

但是,在大多数情况下,除非该区域在其他列中有很多数据,否则我认为这是过度优化。

答案 1 :(得分:2)

要将查询结果限制为特定的列并包括某种关系,可以结合使用->join()->select()

$reportData = Offices::join("regions", "offices.region_id", "=", "regions.id")
->select("offices.id", "offices.name", "regions.name AS region_name")
->get();

注意:必须猜测join逻辑;可以取反({regions.office_id等)

然后,在访问$reportData的内容时,您将只能访问三列:

foreach($reportData AS $data){
  $data->id;
  $data->name;
  $data->region_name;
}