将关系命名为与表上的某个字段同名不是一个好主意。这会导致在尝试访问关系与访问字段时出现问题(如您所发现的那样)。
理想情况下,您的字段应重命名为 。这符合Laravel的惯例,并且是该领域更准确的名称。mime
mime_id
但是,如果您无法更改字段的名称,则应更改关系的名称。
class Upload extends Model {
protected $hidden = array('id', 'user', 'created_at', 'updated_at');
public function uploadMime() {
return $this->belongsTo('App\Models\Mime', 'mime');
}
}
在上面的类中,关系名称现在是 。此外,关系已从 a 更改为 .由于上传表具有哑剧表的外键,因此上载模型属于哑剧模型(而哑剧模型具有一个/多个上载模型)。uploadMime
hasOne
belongsTo
现在,您的代码应如下所示:
$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"
}