我正在创建一个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
?
答案 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();