[英]How make a many-to-many rest API in yii2
我试图让多对五的关系发挥作用,但我无法让它发挥作用。
我有一个包含 3 个表的数据库: users
、 favorites
和videos
。 收藏夹表包含两个指向用户表和视频表的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;
}
如果您需要它们不是默认值,请考虑设置$_verbs
和actionOptions
。
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.