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')
不起作用 。该方法需要一个数组,其中每个元素(操作数本身除外)本身就是一个只有一个元素的数组。
我刚刚尝试过一些可行的方法,但它不是很漂亮,它是遍历元素和 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')...;
我正在使用 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')
不起作用 。该方法需要一个数组,其中每个元素(操作数本身除外)本身就是一个只有一个元素的数组。
我刚刚尝试过一些可行的方法,但它不是很漂亮,它是遍历元素和 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')...;