【问题标题】:How to filter records with RESTful models and controllers in Yii2如何在 Yii2 中使用 RESTful 模型和控制器过滤记录
【发布时间】:2015-07-16 00:59:22
【问题描述】:

我正在使用 Yii2 创建一个 RESTful API,并按照快速入门教程*成功设置了一个名为 Contacts 的模型。我喜欢如何在不创建任何操作的情况下创建、列出、更新和删除记录。

但是我看不到如何过滤结果。我只想返回 contact.user_id 等于 1 的联系人(例如),因为它目前会回复所有记录。在不创建动作的情况下这可能吗?

我也不确定如何限制结果。从我读过的内容来看,我觉得它应该在 URI 后面加上 ?limit=5。

【问题讨论】:

  • 我认为你应该覆盖索引操作
  • 我试图避免这种情况。我在 Yii1 中发现有一个 beforeFind() 方法,我认为它可以做我所追求的,但在 Yii2 中找不到如何做同样的事情。
  • 我认为数据提供者可以在过滤网格时获取值。过滤网格时检查页面的url

标签: php rest yii yii2


【解决方案1】:

您应该返回一个支持分页的数据提供者而不是一组对象。 也许这种方法会更有用一点:

public function actionIndex() 
{
   return new \yii\data\ActiveDataProvider([
        'query' => Contact::find()->where(['user_id' => \Yii::$app->user-id]),
   ]);
}

您也可以保持索引操作不变,但使用prepareDataProvider-callback 提供预设操作:

public function actions()
{
    $actions = parent::actions();
    $actions['index']['prepareDataProvider'] = function($action) 
    {
        return new \yii\data\ActiveDataProvider([
           'query' => Contact::find()->where(['user_id' => \Yii::$app->user-id]),
        ]);
    };

    return $actions;
}

希望对您有所帮助。

【讨论】:

  • 谢谢。这正是我所追求的。编辑:您的第二个选项是我所指的结果。
  • 我同意,第二种解决方案尽可能干净。谢谢!
【解决方案2】:

尽管不想,我不得不重写 index 方法。我的解决方案如下所示:

public function actions()
{
    $actions = parent::actions();
    unset($actions['index']);

    return $actions;
}

public function actionIndex()
{
    return Contact::findAll(['user_id' => \Yii::$app()->user-id]);
}

我想这个解决方案意味着我需要编写自己的分页代码,但这是我希望避免的其他事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多