Php 如何从多对多检索数据,以便在laravel上创建自定义restful api?
我是新来的,希望一切都好。 我正在尝试从透视表中检索数据以构建api。 我正在为音频曲目构建搜索过滤器。 我们的想法是制作一个包含关于每个曲目的所有信息的api,而不是使用ajax。 在我的数据库中,我有3个表:轨迹、标记、标记轨迹: 在tag_轨道内,我有2列: 轨道标识标签标识 我开始在laravel制作一个名为TrackResource的资源。 这是函数toArray($request)的返回: 这是我的api路线:Php 如何从多对多检索数据,以便在laravel上创建自定义restful api?,php,laravel,api,resources,pivot,Php,Laravel,Api,Resources,Pivot,我是新来的,希望一切都好。 我正在尝试从透视表中检索数据以构建api。 我正在为音频曲目构建搜索过滤器。 我们的想法是制作一个包含关于每个曲目的所有信息的api,而不是使用ajax。 在我的数据库中,我有3个表:轨迹、标记、标记轨迹: 在tag_轨道内,我有2列: 轨道标识标签标识 我开始在laravel制作一个名为TrackResource的资源。 这是函数toArray($request)的返回: 这是我的api路线: Route::get('/all-tracks', function (
Route::get('/all-tracks', function () {
return TrackResource::collection(Track::all());
});
我想做的是:
return [
'id' => $this->id,
'title' => $this->title,
'slug' => $this->slug,
'url' => $this->url,
'duration' => $this->duration,
'tags'=>...
];
因此,在我的JSON中,我可以看到为每个曲目分配的所有标记
data:[
"id": 1,
"title": "trackTest",
"url": "q2yQyWGmwJP5hrD3CAECAEgmfeHfpzqimSqYF42N.mpga",
"duration": "00:02:40",
"tags":[tag1, tag2]
];
我所做的是:
return [
'id' => $this->id,
'title' => $this->title,
'slug' => $this->slug,
'url' => $this->url,
'duration' => $this->duration,
'tags' => $this->whenPivotLoadedAs('tags', 'tag_track', function () {
return $this->tags->name;
}),
];
我的JSON响应适用于“id”、“title”、“slug”、“duration”,但不适用于标记
谢谢大家的进步 在
轨迹
模型上指定$with
以在每次查询模型时返回模型上的关系
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Track extends Model
{
/**
* The relationships that should always be loaded.
*
* @var array
*/
protected $with = ['tags'];
/**
* Get the tags for the track.
*/
public function tags()
{
return $this->belongsToMany('App\Tag');
}
}
更新您的tags()
n:n关系以包括来自pivot的字段
protected$with=['tags'];//包括此项以加载关系
公共函数标签()
{
返回$this->belongstomy(…)->withPivot('name');
}
创建一个TagResource
因此,首先在模型轨迹中创建多对多关系:
public function tags()
{
return $this->belongsToMany(Tag::class, 'tag_track', 'track_id', 'tag_id');
}
然后在返回的数组中,它将如下所示:
return [
'id' => $this->id,
'title' => $this->title,
'slug' => $this->slug,
'url' => $this->url,
'duration' => $this->duration,
'tags' => $this->tags->pluck('name')
];
很高兴我能帮忙:)
return [
'id' => $this->id,
'title' => $this->title,
'slug' => $this->slug,
'url' => $this->url,
'duration' => $this->duration,
'tags' => $this->tags->pluck('name')
];