首页 > 解决方案 > 获取嵌套对象中具有自动关系的所有属性

问题描述

我正在创建一个Rest API项目,我有一个具有音乐流派的艺术家,object我像这样attribute创建了这两个classes

艺术家:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Artist extends Model
{
    public $table = 'artist';
    public $timestamps = false;
    
    protected $fillable = [
        'name', '...'
    ];

    //...

    public function musical_genre() {
        return $ this-> belongsTo (MusicalGenre::class, 'musical_genre');
    }
}

音乐类型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class MusicalGenre extends Model
{
    public $table = 'musical_genre';
    public $timestamps = false;

    protected $fillable = [
        'name', '...'
    ];

    // ...

    function parent_genre(){
        return $this->hasMany(MusicalGenre::class, 'parent_genre');
    }
}

如您所见,音乐流派具有自动关系,因为音乐流派可以有父流派。这很好用,但我得到的响应是这样的:

{
    "artist": [
        {
            "id": 14,
            "name": "Britney Spears",
            "musical_genre": {
                "id": 4,
                "name": "electropop",
                "parent_genre": 1
            }
        }
    ]
}

但我希望它可以是这样的:

{
    "artist": [
        {
            "id": 14,
            "name": "Britney Spears",
            "musical_genre": {
                "id": 4,
                "name": "electropop",
                "parent_genre": {
                    "id:" 1,
                    "name": "pop"
                }
            }
        }
    ]
}

controller我有这行来调用具有流派的艺术家:

$artist= Artist::with(['...', 'musical_genre'])->get();

我已经尝试用它来称呼它,musical_genre.parent_genre但我有一个空的父母。

有一种方法可以像我希望的那样做出响应Laravel,具有所有属性,而不仅仅是 id?我没有找到如何在Laravel docs.

编辑:

我已经尝试过使用

$artist->load('parent_genre');

也。

编辑2:

我最后一次尝试是在show() method里面controller,像这样:

public function show($id)
{
    $artist = Artist::with(['login', 'musical_genre'])->findOrFail($id);

    $musical_genre = MusicalGenre::findOrFail($artist->musical_genre); 

    $parent_genre = MusicalGenre::findOrFail($musical_genre->parent_genre); 

    if ($parent_genre){
        $musical_genre->parent_genre = $parent_genre;
    }

    $artist->musical_genre = $musical_genre;

    return response()->json(['artist' => $artist], 200);
}

我得到了同样的回应,只是用"parent_genre": 1. 我试图得到$musical_genre->parent_genre,我得到了这个身体:

"musical_genre": {
    "id": 4,
    "name": "electropop",
    "parent_genre": {
        "id:" 1,
        "name": "pop"
        "parent_genre": null
    }
}

就像我希望的那样。也许这是一些Laravel限制,没有显示artist->musical_genre->parent_genre完整body

标签: phplaravelrestnested

解决方案


$with像这样向MusicalGenre模型添加一个属性:

class MusicalGenre extends Model
{
    public $table = 'musical_genre';
    public $timestamps = false;

    protected $with = ['parent_genre:id,name'];
    .....
}

请参阅:https ://laravel.com/api/5.6/Illuminate/Database/Eloquent/Model.html#property_with

当您调用MusicalGenre模型时,它会自动加载parent_genre。其中的 'id,name' 将检索到的模型限制为两个字段,如果要加载全部,只需仅使用 'parent_genre' 即可。

只需以这种方式调用它,您就可以加载响应:

$artist= Artist::with('musical_genre')->get();

推荐阅读