Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从多对多检索数据,以便在laravel上创建自定义restful api?_Php_Laravel_Api_Resources_Pivot - Fatal编程技术网

Php 如何从多对多检索数据,以便在laravel上创建自定义restful 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 (

我是新来的,希望一切都好。 我正在尝试从透视表中检索数据以构建api。 我正在为音频曲目构建搜索过滤器。 我们的想法是制作一个包含关于每个曲目的所有信息的api,而不是使用ajax。 在我的数据库中,我有3个表:轨迹、标记、标记轨迹: 在tag_轨道内,我有2列: 轨道标识标签标识

我开始在laravel制作一个名为TrackResource的资源。 这是函数toArray($request)的返回:

这是我的api路线:

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')
];