Yii2 API Rest查询参数或条件

Yii2 API Rest查询参数或条件,yii2,query-parameters,restapi,Yii2,Query Parameters,Restapi,我正在用Yii2开发一个API REST应用程序,我有一个查询问题: 我收到一个带有两个参数的通过url获取请求,如下所示: http://localhost/yii2/rest/web/index.php/v1/functions/search?name=test&code=int 我希望在SQL查询中使用或条件来处理get参数,而不是And条件 我知道这样使用是有效的: $provider = new ActiveDataProvider([ 'query' => $

我正在用Yii2开发一个API REST应用程序,我有一个查询问题:

我收到一个带有两个参数的通过url获取请求,如下所示:

http://localhost/yii2/rest/web/index.php/v1/functions/search?name=test&code=int
我希望在SQL查询中使用或条件来处理get参数,而不是And条件

我知道这样使用是有效的

$provider = new ActiveDataProvider([
    'query' => $model->find()->select('idFunction')->where(['or',['name'=>'test'],['code'=>'int']]),
    'pagination' => false
]);
但是这种方法不起作用。它表现为一个和条件:

$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');
    }
}    
公共函数actionSearch()
{
$params=\Yii::$app->request->queryParams;
退出(打印($params));
如果(!empty($params)){
$model=new$this->modelClass;
foreach($key=>$value的参数){
如果(!$model->hasAttribute($key)){
抛出新的\yii\web\HttpException(404,“无效属性:”.$key);
}
}
试一试{
$provider=新的ActiveDataProvider([
'query'=>$model->find()->select('idFunction')->where(['or',$params]),
“分页”=>false
]);
}捕获(例外$ex){
抛出新的\yii\web\HttpException(500,“内部服务器错误”);
}
如果($provider->getCount(),您可以迭代参数数组来修改它。
像我在注释中建议的那样使用
array\u unshift($conditions,'or')
不起作用。
该方法需要一个数组,其中除了操作数本身之外,每个元素都是它自己,一个只有一个元素的数组

我刚刚尝试了一些有效的方法,但不是很好,就是迭代元素并返回预期形式的数组

$orQuery=['或'];
foreach($key=>$value的参数){
$orQuery[]=[$key=>$value];
}
$query->where($orQuery);
这将返回
query()
方法所需的数组

['or',['name1'=>'value1'],['name2'=>'value2'],…]
这将生成SQL:

从表中选择*,其中('name1'='value1')或('name2'='value2')。。。;

我猜问题是,你正在传递数组中的所有参数,作为数组中具有
的第二个元素,基本上做
这一切
null
所以它作为
工作。你是否尝试将第一个元素设置为
?类似这样:
$model->find()->其中(数组_unshift($params,'or'))
?您可以尝试一下,然后在调试器上检查生成的SQL。Tks for your response@RaulSauco。我已经尝试了您的建议,现在它为我带来了表中的所有ID值。如何在调试器上检查生成的SQL?如果您配置了调试器,YII_DEBUG为true,并且您的IP在允许列表上,即您e在与服务器相同的计算机上,您应该在页面底部关闭调试栏。您也可以在端点处访问该页面。在测试REST请求时,他们可能看不到调试栏。但是,在响应标题中应该有指向特定请求的调试器页面的链接。@RaulSauco谢谢!我已到达调试器页面,但是,正如Michal Hynčica所说,我只能列出一个请求状态列表。我想这是因为我正在测试请求REST谢谢@RaulSauco,它工作得非常好!@4aLifeTime听到它工作了真是太好了。别忘了将答案标记为已接受和/或投票。是的,我刚刚做了。因为我是stackoverflow的新手,所以在你的c之后我还不能投票我意识到我可以将答案标记为已接受,所以我做到了。再次感谢!