Laravel 5.6 API 资源未显示关系数据

Posted

技术标签:

【中文标题】Laravel 5.6 API 资源未显示关系数据【英文标题】:Laravel 5.6 API Resource not showing Relationship data 【发布时间】:2018-11-30 23:47:39 【问题描述】:

我想在 laravel 5.6 中使用 Resource 将关系数据转换为 json 当我查询时,我得到response.data.created_by 作为一个对象。 (框内标记的第一个数据) (我需要使用 API 资源的这种功能) 但是对于API Resources,它仅在response.response.data.created_by 中显示id 而不是"created_by" object(框内标记的第二个数据) *数据差异在方框内标出。 *数据是使用 Eager fetch 获取的。

网址:http://localhost:8000/api/product/unit 回应:

“数据”: [ “身份证”:1, “单位”:“米”, “符号”:“米”, “十进制”:1, +-------------------------------------------------- ---------------------------------+ |"created_by": | | “身份证”:1,| | “名称”:“管理员”,| | "电子邮件": "admin@gmail.com", | | "api_token": "$2y$10$.c7eJGS6x/C8JN9Hd.Qc1OgPUS8txMDuIHjZNRRlHQVGrYbJcC5u", | | "created_at": "2018-05-09 15:45:59", | | “updated_at”:“2018-06-08 15:38:41”| |, | +-------------------------------------------------- ---------------------------------+ “更新者”: “身份证”:1, “名称”:“管理员”, “电子邮件”:“admin@gmail.com”, "api_token": "$2y$10$.c7eJGS6x/C8JN9Hd.Qc1OgPUS8txMDuIHjZNRRlHQVGrYbJcC5u", "created_at": "2018-05-09 15:45:59", “updated_at”:“2018-06-08 15:38:41” , "created_at": "2018-06-19 00:38:54", “updated_at”:“2018-06-19 20:00:16” ], “资源”: “数据”: [ “身份证”:1, “单位”:“米”, “符号”:“米”, “十进制”:1, +----------------+ |“创建者”:1,| +----------------+ “更新者”:1, “创建时间”: “日期”:“2018-06-19 00:38:54.000000”, “时区类型”:3, “时区”:“亚洲/加尔各答” , “更新时间”: "日期": "2018-06-19 20:00:16.000000", “时区类型”:3, “时区”:“亚洲/加尔各答” ]

UnitController.php

命名空间 App\Http\Controllers\Product; 使用 App\Models\Product\Unit; 使用 Illuminate\Http\Request; 使用 App\Http\Controllers\Controller; 使用 Illuminate\Support\Facades\Validator; 使用 App\Http\Resources\Product\UnitResourceCollection; 使用 App\Http\Resources\Product\UnitResource; 使用 Illuminate\Validation\ValidationException; 类 UnitController 扩展控制器 公共函数索引() $units = Unit::with(['created_by', 'updated_by'])->get(); +-------------------------------------------------- -----+ |返回[ | | '数据' => $units, | | '资源' => 新的 UnitResourceCollection($units) | |]; | +-------------------------------------------------- -----+

单元模型:

命名空间应用\模型\产品; 使用 Illuminate\Database\Eloquent\Model; 类单元扩展模型 公共函数 created_by() return $this->belongsTo('App\User', 'created_by', 'id'); 公共函数updated_by() return $this->belongsTo('App\User', 'updated_by', 'id');
UnitResource.php
<pre>
namespace App\Http\Resources\Product;

use App\Http\Resources\UserResource;
use Illuminate\Http\Resources\Json\JsonResource;

class UnitResource extends JsonResource

    public function toArray($request)
    
        return [
            'id' => $this->id,
            'unit' => $this->unit,
            'symbol' => $this->symbol,
            'decimal' => $this->decimal,
            'createdBy' => $this->created_by,
            'updatedBy' => $this->updated_by,
            'createdAt' => $this->created_at,
            'updatedAt' => $this->updated_at
        ];
    

【问题讨论】:

【参考方案1】:

问题出在单元模型中:我必须使用与列名称 created_by 不同的方法名称 created_by()

更改以下代码后,它正在工作:

Unit.php模特:

public function created_by() -> public function createdby()

public function updated_by() -> public function updatedby()

UnitController.php 控制器:

$units = Unit::with(['created_by', 'updated_by'])-&gt;get(); -> $units = Unit::with(['createdby', 'updatedby'])-&gt;get();

UnitResource.php资源:

'createdBy' =&gt; $this-&gt;created_by, -> 'createdBy' =&gt;new UserResource($this-&gt;createdby),

'updatedBy' =&gt; $this-&gt;updated_by, -> 'updatedBy' =&gt; new UserResource($this-&gt;updatedby),

【讨论】:

以上是关于Laravel 5.6 API 资源未显示关系数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在刀片视图 laravel 5.6 中访问定义的关系

将 Laravel 从 5.6 升级到 6.0 后,调用未定义的 str_random() 函数不起作用

多个 Laravel Eloquent 关系未显示来自所有关系的数据

减少对外部 API 的身份验证调用(Laravel 5.6)

Laravel API 资源中的多级关系

从 Laravel API 服务器接收的数据未显示在 Flutter 屏幕上