Yii2 API rest 查询参数或条件

Yii2 API Rest query parameters or condition

我正在使用 Yii2 开发一个 API REST 应用程序,我遇到了这个查询问题:

我收到 url 的 get 请求,其中包含两个参数 ,如下所示:

http://localhost/yii2/rest/web/index.php/v1/functions/search?name=test&code=int

我想在我的 SQL 查询中使用 Or 条件 来处理 get 参数,而不是 And 条件。

我知道使用这种方式有效:

$provider = new ActiveDataProvider([
    'query' => $model->find()->select('idFunction')->where(['or',['name'=>'test'],['code'=>'int']]),
    'pagination' => false
]);

但是这种方式行不通。它表现为 And 条件:

$provider = new ActiveDataProvider([
    'query' => $model->find()->select('idFunction')->where(['or',$params]),
    'pagination' => false
]);

我认为它必须按照变量 $params 的转换方式进行。

这是我的全部代码:

public function actionSearch()
{
    $params = \Yii::$app->request->queryParams;
    exit(print_r($params));
    if (!empty($params)) {
        $model = new $this->modelClass;
        foreach ($params as $key => $value) {
            if (!$model->hasAttribute($key)) {
                throw new \yii\web\HttpException(404, 'Invalid attribute:' . $key);
            }
        }
        try {
            $provider = new ActiveDataProvider([
                    'query' => $model->find()->select('idFunction')->where(['or',$params]),

                'pagination' => false
            ]);
        } catch (Exception $ex) {
            throw new \yii\web\HttpException(500, 'Internal server error');
        }

        if ($provider->getCount() <= 0) {
            throw new \yii\web\HttpException(404, 'No entries found with this query string');
        } else {
            return $provider;
        }
    } else {
        throw new \yii\web\HttpException(400, 'There are no query string');
    }
}    

您可以遍历参数数组来修改它。

像我在评论中建议的那样使用 array_unshift($conditions, 'or') 不起作用 。该方法需要一个数组,其中每个元素(操作数本身除外)本身就是一个只有一个元素的数组。

Yii2 operator format docs

我刚刚尝试过一些可行的方法,但它不是很漂亮,它是遍历元素和 return 预期形式的数组。

$orQuery = ['or'];
foreach ($params as $key => $value) {
   $orQuery[] = [$key => $value];
}
$query->where($orQuery);

这 return 是 query() 方法需要的数组。

['or', ['name1' => 'value1'], ['name2' => 'value2'], ...]

产生 SQL:

SELECT * FROM table WHERE ('name1'='value1') OR ('name2'='value2')...;