Yii2 如何在YII restful GET api上实现过滤?
我正在开发Yii的restfulapi 我的控制器名称是Yii2 如何在YII restful GET api上实现过滤?,yii2,Yii2,我正在开发Yii的restfulapi 我的控制器名称是ProductsController,型号是Product 当我像这样调用API时,我得到了所有产品的列表 但是,现在我想过滤清单API中的记录 例如,我只想要那些产品名为的记录。 如何实现这一点? 如何在我的RESTAPI上应用适当的过滤。我是新来的。所以,我不知道如何实现这一点。我也遵循了他们的文档,但无法理解 请有人给我推荐一个好的例子或实现这一点的方法吗?首先,您需要像往常一样在您的模型中使用 然后是控制器的工作,根据选择的实现,我
ProductsController
,型号是Product
当我像这样调用API时,我得到了所有产品的列表
但是,现在我想过滤清单API中的记录
例如,我只想要那些产品名为的记录。
如何实现这一点?
如何在我的RESTAPI上应用适当的过滤。我是新来的。所以,我不知道如何实现这一点。我也遵循了他们的文档,但无法理解
请有人给我推荐一个好的例子或实现这一点的方法吗?首先,您需要像往常一样在您的模型中使用
然后是控制器的工作,根据选择的实现,我可以给您一些提示:
如果您的ProductsController
扩展了yii\rest\ActiveController
基本上是最简单的方法,因为几乎所有的东西都已经为你准备好了。您只需要在那里提供$modelClass
,并稍微调整actions()
方法
public function actions()
{
$actions = parent::actions();
$actions['index']['dataFilter'] = [
'class' => \yii\data\ActiveDataFilter::class,
'searchModel' => $this->modelClass,
];
return $actions;
}
这里我们正在修改IndexAction的配置,默认情况下,IndexAction负责GET/products
请求处理。配置已定义,我们只想添加dataFilter
键,该键配置为使用哪个进程对搜索的模型进行过滤查询,该模型是我们的产品
。其他操作保持不变
现在您可以这样使用(假设存储产品名称的属性是name
):
GET/products?filter[name]=chairs
将返回名称为chairs
的所有产品的列表
GET/products?filter[name][like]=chairs
将返回name包含wordchairs
的所有产品的列表
如果您的ProductsController
没有扩展yii\rest\ActiveController
,但仍在使用数据提供程序获取集合
希望您的ProductsController
能够扩展yii\rest\Controller
,因为它已经从序列化程序和其他实用程序中受益,但不是必需的
解决方案与上述相同,但现在您必须自己添加,因此请确保控制器的操作包含以下内容:
$requestParams = \Yii::$app->getRequest()->getBodyParams(); // [1]
if (empty($requestParams)) {
$requestParams = \Yii::$app->getRequest()->getQueryParams(); // [2]
}
$dataFilter = new \yii\data\ActiveDataFilter([
'searchModel' => Product::class // [3]
]);
if ($dataFilter->load($requestParams)) {
$filter = $dataFilter->build(); // [4]
if ($filter === false) { // [5]
return $dataFilter;
}
}
$query = Product::find();
if (!empty($filter)) {
$query->andWhere($filter); // [6]
}
return new \yii\data\ActiveDataProvider([
'query' => $query,
'pagination' => [
'params' => $requestParams,
],
'sort' => [
'params' => $requestParams,
],
]); // [7]
这里发生了什么(与代码注释匹配的数字):
我们正在从尸体上收集请求参数
如果这些是空的,我们从URL获取它们
我们正在准备如上所述的ActiveDataFilter,搜索模型为产品
ActiveDataFilter对象是使用收集的参数构建的
如果构建过程返回false
,则表示存在错误(通常验证不成功),因此我们将对象返回给用户以查看错误列表
如果过滤器不是空的,我们将其应用于产品的数据库查询
最后,我们将配置ActiveDataProvider对象以返回过滤(以及分页和排序(如果适用))集合
现在您可以像上面提到的那样使用DataProvider过滤器
如果您的ProductsController
未使用数据提供程序获取集合
您需要创建自定义解决方案