Yii2 如何在YII restful GET api上实现过滤?

Yii2 如何在YII restful GET api上实现过滤?,yii2,Yii2,我正在开发Yii的restfulapi 我的控制器名称是ProductsController,型号是Product 当我像这样调用API时,我得到了所有产品的列表 但是,现在我想过滤清单API中的记录 例如,我只想要那些产品名为的记录。 如何实现这一点? 如何在我的RESTAPI上应用适当的过滤。我是新来的。所以,我不知道如何实现这一点。我也遵循了他们的文档,但无法理解 请有人给我推荐一个好的例子或实现这一点的方法吗?首先,您需要像往常一样在您的模型中使用 然后是控制器的工作,根据选择的实现,我

我正在开发Yii的restfulapi

我的控制器名称是
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包含word
    chairs
    的所有产品的列表

如果您的
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
    未使用数据提供程序获取集合 您需要创建自定义解决方案