如何获取附加了数据透视表的数据?

时间:2019-05-25 10:03:30

标签: php laravel

我正在尝试从“列表”表中获取数据,并在该列表中包含一个包含曲目ID的数组。

这是数据库模型的示例,关系为N:M。

database model

在我的列表模型中,我添加了以下方法:

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
]
}

我认为我尝试过的事情比适当的解决方案要复杂得多。

您将如何以这种方式获取数据?

谢谢。

1 个答案:

答案 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