gpt4 book ai didi

php - 使用 Eloquent 和 Laravel 5 在 json 响应中包含模型关系

转载 作者:IT王子 更新时间:2023-10-29 01:24:22 27 4
gpt4 key购买 nike

我有这样的模型设置:

<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Upload extends Model {

/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'uploads';

/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = array('id', 'user', 'created_at', 'updated_at');

public function mime() {
return $this->hasOne('App\Models\Mime', 'mime');
}
}

而当JsonSerialize()被调用时,它会返回:

{
"serverPath": "upload/2015/06/06/21/filename.jpg",
"filename": "filename.jpg",
"mime": "92"
}

这个 92 引用另一个表中的 id(由 App\Models\Mime 表示),并带有一个与之关联的字符串 type .我想用上述字符串替换这个 92

{
"serverPath": "upload/2015/06/06/21/filename.jpg",
"filename": "filename.jpg",
"mime": "image/jpeg"
}

这怎么可能?我在 Upload 模型中使用 protected $appends 尝试了一些东西,但我不确定我是否完全理解如何在模型中使用/访问关系。

澄清mimes包含列idtype,而表uploads 包含一个名为 mime 的整数列,它引用 mimes

中的一个 id

最佳答案

将关系命名为与表中的某个字段同名并不是一个好主意。在尝试访问关系与访问字段时,这会导致问题(如您所见)。

理想情况下,您的 mime 字段应重命名为 mime_id。这符合 Laravel 的约定,并且是更准确的字段名称。

但是,如果您不能更改字段的名称,则应该更改关系的名称。

class Upload extends Model {
protected $hidden = array('id', 'user', 'created_at', 'updated_at');

public function uploadMime() {
return $this->belongsTo('App\Models\Mime', 'mime');
}
}

在上面的类中,关系名称现在是 uploadMime。此外,关系从 hasOne 更改为 belongsTo。由于您的上传表具有指向 mime 表的外键,因此上传模型属于 Mime 模型(并且 Mime 模型有一个/有许多上传模型)。

现在,您的代码应该类似于:

$data = \App\Models\Upload::with('uploadMime')->findOrFail(1);
return new JsonResponse($data);

这应该让你输出一些类似的东西:

{
"serverPath": "upload/2015/06/06/21/filename.jpg",
"filename": "filename.jpg",
"mime": "92",
"uploadMime": {
"id": 92,
"type": "image/jpeg"
}
}

使用 $appends 和属性访问器修改 JSON

如果您想更接近您在问题中提供的 JSON 输出,您可以创建一个 mimeType 访问器并将其添加到 $appends 属性:

class Upload extends Model {
// hide the mime field and uploadMime data
protected $hidden = array('id', 'user', 'created_at', 'updated_at', 'mime', 'uploadMime');

// add the mimeType attribute to the array
protected $appends = array('mimeType');

// code for $this->mimeType attribute
public function getMimeTypeAttribute($value) {
$mimeType = null;
if ($this->uploadMime) {
$mimeType = $this->uploadMime->type;
}
return $mimeType;
}

public function uploadMime() {
return $this->belongsTo('App\Models\Mime', 'mime');
}
}

这应该让你输出一些类似的东西:

{
"serverPath": "upload/2015/06/06/21/filename.jpg",
"filename": "filename.jpg",
"mimeType": "image/jpeg"
}

通过覆盖 toArray() 函数修改 JSON

或者,如果你真的想让JSON使用mime键,你可以直接修改toArray()方法:

class Upload extends Model {
// hide uploadMime data, but not the mime field
protected $hidden = array('id', 'user', 'created_at', 'updated_at', 'uploadMime');

public function uploadMime() {
return $this->belongsTo('App\Models\Mime', 'mime');
}

// override the toArray function (called by toJson)
public function toArray() {
// get the original array to be displayed
$data = parent::toArray();

// change the value of the 'mime' key
if ($this->uploadMime) {
$data['mime'] = $this->uploadMime->type;
} else {
$data['mime'] = null;
}

return $data;
}
}

这应该让你输出一些类似的东西:

{
"serverPath": "upload/2015/06/06/21/filename.jpg",
"filename": "filename.jpg",
"mime": "image/jpeg"
}

关于php - 使用 Eloquent 和 Laravel 5 在 json 响应中包含模型关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30688076/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com