Laravel Eloquent 获取关系字段
Laravel Eloquent get relation field
我需要从 eloquent 对象中的关系中获取一个字段。
我正在使用数据表传递 eloquent 对象以供查看。
我有一个名为 Offices 的模型和一个名为 Regions 的模型
办公室
ID
姓名
地区 -> 所属地区
地区
ID
名字
我需要这样的东西:
Offices.id、Offices.name、Regions.name
我已经尝试了以下但失败了,我如何在 get 方法中获取区域名称?
$ReportData = Offices::with('region')->get(['id', 'name', 'region.name']);
return datatables()->eloquent($ReportData)
Eloquent 关系不使用联接,因此您无法 select 在 Offices 查询中使用它们。
$ReportData = Offices::with('region')->get(['id', 'name']);
将执行单独的查询以预先加载所有区域,同时允许您以 属性:
的形式访问每个项目的相关区域
$ReportData[0]->region->name
如果需要,您可以将其展平、使用地图或使用带有联接的查询,就像 Tim 建议的那样。
您可以通过使用以下闭包来限制从数据库中 selected 的区域数据:
$ReportData = Offices::with(['region' => function($q) {
$q->select('name');
}])->get(['id', 'name']);
但是,在大多数情况下,我会认为这是过度优化,除非该区域在其他列中有大量数据。
要将查询结果限制为特定列,并包括关系的结果,您可以使用 ->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;
}
由于这在 google 上排名第一,而且这是我 运行 此搜索时得到的结果,我认为它也应该包含 Laravel 8 答案。
来自 the Laravel docs
您可以在预先加载关系时指定列,如下所示:
$ReportData = Offices::with('region:id, name')->get(['id', 'name']);
请注意,您应该始终在此规范中包含 id 和 foreign id 列,否则将无法正常工作。
所以它实际上应该是这样的:
$ReportData = Offices::with('region:id, name, office_id')->get(['id', 'name']);
或与您的特定关系相对应的任何内容。
希望你觉得这很有用,勇敢的 Laravel 开发人员偶然发现了这个!
我需要从 eloquent 对象中的关系中获取一个字段。
我正在使用数据表传递 eloquent 对象以供查看。
我有一个名为 Offices 的模型和一个名为 Regions 的模型
办公室 ID 姓名 地区 -> 所属地区
地区 ID 名字
我需要这样的东西: Offices.id、Offices.name、Regions.name
我已经尝试了以下但失败了,我如何在 get 方法中获取区域名称?
$ReportData = Offices::with('region')->get(['id', 'name', 'region.name']);
return datatables()->eloquent($ReportData)
Eloquent 关系不使用联接,因此您无法 select 在 Offices 查询中使用它们。
$ReportData = Offices::with('region')->get(['id', 'name']);
将执行单独的查询以预先加载所有区域,同时允许您以 属性:
的形式访问每个项目的相关区域$ReportData[0]->region->name
如果需要,您可以将其展平、使用地图或使用带有联接的查询,就像 Tim 建议的那样。
您可以通过使用以下闭包来限制从数据库中 selected 的区域数据:
$ReportData = Offices::with(['region' => function($q) {
$q->select('name');
}])->get(['id', 'name']);
但是,在大多数情况下,我会认为这是过度优化,除非该区域在其他列中有大量数据。
要将查询结果限制为特定列,并包括关系的结果,您可以使用 ->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;
}
由于这在 google 上排名第一,而且这是我 运行 此搜索时得到的结果,我认为它也应该包含 Laravel 8 答案。 来自 the Laravel docs
您可以在预先加载关系时指定列,如下所示:
$ReportData = Offices::with('region:id, name')->get(['id', 'name']);
请注意,您应该始终在此规范中包含 id 和 foreign id 列,否则将无法正常工作。
所以它实际上应该是这样的:
$ReportData = Offices::with('region:id, name, office_id')->get(['id', 'name']);
或与您的特定关系相对应的任何内容。
希望你觉得这很有用,勇敢的 Laravel 开发人员偶然发现了这个!