首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拉勒维尔雄辩得到关系场

问拉勒维尔雄辩得到关系场
EN

Stack Overflow用户
提问于 2018-08-07 18:39:43
回答 3查看 5K关注 0票数 1

我需要从雄辩的对象内部从关系中得到一个字段。

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

我有一个叫做办公室的模型和一个叫做区域的模型

办事处id名称区域->归属地区

区域id名称

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

我已经尝试过下面的方法,但是失败了,如何在get方法中获得区域名称?

代码语言:javascript
复制
$ReportData = Offices::with('region')->get(['id', 'name', 'region.name']);
return datatables()->eloquent($ReportData)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-07 19:20:13

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

代码语言:javascript
复制
$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的内容时,您只能访问以下三列:

代码语言:javascript
复制
foreach($reportData AS $data){
  $data->id;
  $data->name;
  $data->region_name;
}
票数 4
EN

Stack Overflow用户

发布于 2018-08-07 18:49:52

雄辩的关系不使用联接,因此您无法在Office查询中选择它们。

代码语言:javascript
复制
$ReportData = Offices::with('region')->get(['id', 'name']);

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

代码语言:javascript
复制
$ReportData[0]->region->name

如果你想要的话,你可以把它夷为平地,使用地图,或者像提姆建议的那样使用带有连接的查询。

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

代码语言:javascript
复制
$ReportData = Offices::with(['region' => function($q) {
    $q->select('name');
}])->get(['id', 'name']);

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

票数 5
EN

Stack Overflow用户

发布于 2022-01-21 15:40:59

因为这是在谷歌上排名第一,这是我在运行这个搜索时得到的,我认为它也应该包含Laravel 8的答案。来自拉勒维尔博士

在急切加载如下关系时,您可以指定列:

代码语言:javascript
复制
$ReportData = Offices::with('region:id, name')->get(['id', 'name']);

请注意,您应该始终在此规范中包括id和foreign id列,否则它将无法工作。

所以它实际上应该是这样的:

代码语言:javascript
复制
    $ReportData = Offices::with('region:id, name, office_id')->get(['id', 'name']);

或者任何与你的特定关系相对应的东西。

希望您能发现这一点,勇敢的Laravel开发人员无意中发现了这一点!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51733418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档