获取具有自动关系的嵌套对象中的所有属性

时间:2018-08-06 18:30:14

标签: php laravel rest nested

我正在创建一个Rest API项目,我有一个音乐类型为object的音乐人,并且创建了这两个attribute,如下所示:< / p>

艺术家:

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" } } } ] } 中,我有这样一行来呼叫具有流派的Artist:

controller

我已经尝试用$artist= Artist::with(['...', 'musical_genre'])->get(); 来调用它,但是我有一个空的父母。

有一种方法可以像我在musical_genre.parent_genre中所希望的那样,使用所有属性而不只是ID?我没有在Laravel中找到该怎么做。

编辑:

我已经尝试使用

Laravel docs

也是。

编辑2:

我最后一次尝试是在$artist->load('parent_genre');内的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

2 个答案:

答案 0 :(得分:0)

$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();

答案 1 :(得分:0)

请尝试执行此操作以嵌套嵌套:

    $artist= Artist::with(['musical_genre'=> function ($query) {
        $query->with(['parent_genre']);
    }])->get();