我正在尝试从“列表”表中获取数据,并在该列表中包含一个包含曲目ID的数组。
这是数据库模型的示例,关系为N:M。
在我的列表模型中,我添加了以下方法:
public function tracks()
{
return $this->belongsToMany(Track::class, 'List_Tracks', 'id_list', 'id_track');
}
因此,在ListController中,我正在执行以下操作:
$list = List::find($id);
$list->tracks_list = $list->tracks->pluck('track_id');
return $list;
我得到的是与同一列表中的音轨一样多的对象,例如:
[
{
"id_track": 1,
"name": "Yesterday",
"tracks_list": [
1,
2
]
"pivot": {
"id_list": 1,
"id_track": 1
}
},
{
"id_track": 2,
"name": "Lucy in the sky with diamonds",
"pivot": {
"id_list": 1,
"id_track": 2
}
}
]
但是我想要得到的是:
{
"id_list": 1,
"name": "The Best of The Beatles",
"tracks_list": [
1,
2
]
}
我认为我尝试过的事情比适当的解决方案要复杂得多。
您将如何以这种方式获取数据?
谢谢。
答案 0 :(得分:0)
您需要先加载关系,然后编写其余的雄辩查询,否则将从数据透视表中仅获取ID列表。
List::with('tracks')->where('id', '=', $id)->first();
// Following method should work too
List::with('tracks')->find($id);
根据您的评论-只需获取与列表相关的ID数组,您无需加载关系即可,只能使用:
List::find($id)->tracks()->pluck('id');
// In case previous method will not work, you can try this one:
List::find($id)->tracks()->pluck('tracks.id');
// before dot should be name of the table, not relationship's.
因此,如果您只需要附加到播放列表中的曲目ID。我建议通过以下方法将其添加到您的列表模型中:
// App\Models\List
public function getTrackIdsAttribute()
{
return $this->tracks->pluck('id')->toArray();
}
然后,您应该可以简单地调用List::find($id)->trackIds
来获取附加到给定列表的所有曲目ID。如果不确定为什么将方法定义为getTrackIdsAttribute
并仅在模型上调用trackIds
,请查看Eloquent: Mutators。