繁体   English   中英

如何在 yii2 中创建多对多 rest API

[英]How make a many-to-many rest API in yii2

我试图让多对五的关系发挥作用,但我无法让它发挥作用。

我有一个包含 3 个表的数据库: usersfavoritesvideos 收藏夹表包含两个指向用户表和视频表的foreign keys

目前我有以下内容:

用户 Model:

public function getVideos()
{
    return $this->hasMany(Video::class, ['id' => 'video_id'])->viaTable(UserFavorites::tableName(), ['favorite_id' => 'id']);
}

视频 Model:

public function getUsers()
{
    return $this->hasMany(User::class, ['id' => 'user_id'])->via(UserFavorites::tableName());
}

视频控制器:(活动控制器)

public function actions()
{
    $actions = parent::actions();
    $actions['index']['prepareDataProvider'] = [$this, 'prepareDataProvider'];
    return $actions;
}

public function prepareDataProvider()
{
    $user = User::findOne('1=1');
    return new ActiveDataProvider([
       'query' => $user->getVideos()
    ]);
}

按照他们所做的: yii2 activedataprovider 中的多对多关系
但这没有用。 我也尝试过使用extraFields并在没有运气的情况下进行expand

我该怎么做才能使结果看起来像这样:

[{
    "id": 1, 
    "name": "video name",
    "likes": 69,
    "user": [{
        "id": 1,
        "name": "John"
    }]
},
...
]

您需要在几个地方更新代码。

REST有源 controller

看起来您正在尝试获取一个用户喜欢它的视频,您应该使用查看操作,而不是索引操作,这应该用于获取视频列表,您可以使用基本view操作,不需要覆盖它,它会像你需要的那样工作。

在 controller 中,设置 model 就足够了。

use yii\rest\ActiveController;

class VideoController extends ActiveController
{    
    public $modelClass = Video::class;
}

如果您需要它们不是默认值,请考虑设置$_verbsactionOptions

model

您应该使用extraFields将方法公开为字段。

use yii\db\ActiveRecord;

class Video extends ActiveRecord
{
    // Other methods here...

    public function getUsers()
    {
        return $this->hasMany(User::class, ['id' => 'user_id'])
            ->viaTable(UserFavorites::tableName(), [
                'video_id' => 'id'
            ]);
    }

    public function extraFields()
    {
        return [
            'users'
        ];
    }
}

如果您想为 API 调用使用与 function 相同的名称,即getUsers()调用使用expand=users users方法调用可以扩展使用expandFields ,扩展格式,即'likes' => 'users'

然后,使用以下命令查询您的 API:

https://apiv1.example.com/videos/45?expand=users

应该给你预期的结果,就像你的帖子一样

[{
    "id": 1, 
    "name": "video name",
    "likes": 69,
    "users": [{
        "id": 1,
        "name": "John"
    }]
},
...
]

请注意,如果您以相同的方式配置,用户数组将被称为“用户”而不是“用户”,您可以使用extraFields中的扩展符号来更改它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM