php - 获取嵌套对象中具有自动关系的所有属性
问题描述
我正在创建一个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
?
解决方案
$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();
推荐阅读
- google-apps-script - Sendmail 内联图像也是附件,但不应该是
- ios - 如果我导入 Firebase,是否还包括 FirebaseAuth 和 FirebaseDatabase?
- python - 如何让对象在一段时间后消失?
- mysql - 是否可以在 Laravel 5.8 中使用 eloquent 或查询构建器构建插入忽略/插入或更新?不循环每条记录?
- php - #laravel 419 错误出现提交任何形式此问题仅在其他托管应用程序上的 GoDaddy 托管上工作正常
- django - 如何在 Django REST Framework API 的 OneToOne 序列化器字段上允许空白字段?
- python-3.x - 这是检查最多 9 个泛数字的正确方法吗?
- r - R 扫描函数如何与多维数组一起工作?
- reactjs - Redux - 从后端获取初始状态 - 这是正确的方法吗?
- swift - 在用户输入上添加结构