【问题标题】:Laravel Eloquent get relation fieldLaravel Eloquent 获取关系字段
【发布时间】:2018-08-07 18:39:43
【问题描述】:

我需要从 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)

【问题讨论】:

  • 可能想做Offices::join("regions", ...)->select("offices.id", "offices.name", "regions.name AS region_name")->get();(尽管填写加入的逻辑);否则,无论您使用$reportData,您都必须使用$office->region->name
  • @TimLewis 从未使用过 join 怎么办?
  • @TimLewis 这已经奏效,作为答案发布,我会接受它

标签: php laravel eloquent laravel-5.5


【解决方案1】:

Eloquent 关系不使用连接,因此您无法在 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']);

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

【讨论】:

  • 这可行,但在} 之后缺少]
【解决方案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;
}

【讨论】:

    【解决方案3】:

    由于这在 google 上排名第一,这是我运行此搜索时得到的,我认为它也应该包含 Laravel 8 答案。 来自the Laravel docs

    您可以在像这样急切加载关系时指定列:

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

    请注意,您应该始终在此规范中包含 id 和外来 id 列,否则将不起作用。

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

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

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

    希望你发现这个有用,勇敢的 Laravel 开发人员偶然发现了这个!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-14
      • 2017-01-12
      • 2017-05-01
      • 1970-01-01
      • 2020-09-23
      • 2014-10-29
      • 2015-09-17
      • 1970-01-01
      相关资源
      最近更新 更多