繁体   English   中英

如何在Yii2搜索模型中使用数组进行搜索

[英]How to search with an array in Yii2 search model

public function actionIndex()
{
    $searchModel = new SubjectSearch();
    $searchModel->search()->query->andFilterWhere(['in','subjectID',[1,2,3]]);
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

    return $this->render('index', [
        'searchModel' => $searchModel,
        'dataProvider' => $dataProvider,
    ]);
}

我尝试了不同的方式

$searchModel->subjectID = [1,2,3]

$searchModel->search()->query->andFilterWhere(['in','subjectID',[1,2,3]]);

但是它们对我不起作用。

实际上,在这种情况下,ArrayDataprovider似乎是一个更好的解决方案,但是Array Dataprovide无法与过滤器一起使用。

顺便说一句,真正的问题是要与ManyToMany Relationship搜索。

许多用户到多个组。
许多小组到许多主题。

UserGroupTbl包含UserID和GroupID
SubjectGroup包含SubjectID和GroupID

我正在尝试这样做:

$groups = $appUser->getGroups();
$subjectIDs = [];
foreach ($groups as $group) {
    $subjectIDs[] = $group->getSubjectIDs
}
$searchModel = new SubjectSearch();
$searchModel->subjectID = $subjectIDs;

但这是行不通的,当然不是一个好方法

请帮我一点。

===============更新==============

    $searchModel = new SubjectSearch();
    $searchModel->subjectID = [1,2];
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

导致“数组到字符串转换”错误。

    $searchModel = new SubjectSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
    $dataProvider->query->andFilterWhere(['in','subjectID',[1,2]]);;

这种方法实际上有效。 顺便说一句,关于处理多对多搜索,您有一点建议吗?

每次调用search时,都会得到一个新的查询对象,因此您无法向其添加参数,请使用以下方法:

$searchModel = new SubjectSearch();
$searchModel->subjectID = [1,2,3];
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);

在SubjectSearch模型中,您应该在搜索功能中包含以下内容:

$query->andFilterWhere(
   [
      ...
      'subjectId' => $this->subjectID,
      ...
   ]
);

您不会相信今天我也陷入了同样的境地。 我认为IN可以按我的意愿工作。 但是,奇怪的是对我没用。

我试过了。

$dataProvider->query->andFilterWhere(['IN','subjectID', $this->subjectID]);

在Yii Debugger中,此查询已更改为:

SELECT * FROM tableName WHERE(条件)AND(subjectID ='1,2')...

然后,我将查询更改为

$query->andFilterWhere(['subjectID' => $this->subjectID]);

并且,在Yii Debugger中检查后,查询自动更改为:

SELECT * FROM tableName WHERE(条件)AND(subjectID IN('1,2'))...

我一直在寻找。

更新的代码

我建议您遵循以下给出的代码。 它会工作。 @ Ed209的答案也是正确的。

public function actionIndex(){
    $searchModel = new SubjectSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

    return $this->render('index', [
        'searchModel' => $searchModel,
        'dataProvider' => $dataProvider,
    ]);
}

SubjectSearch.php

class SubjectSearch {
  .
  .
  .

  public function search($params) {
    $query = SubjectSearch::find();

    $this->load($params);

    if($this->subjectID != null){
      $query->andFilterWhere(['subjectID' => $this->subjectID]);
    }

    // You can add more clauses here to make your data more appropriate.


    $dataProvider = new ActiveDataProvider([
      'query' => $query,
      'pagination' => array('pageSize' => 20),
    ]);

    if (!$this->validate()) {
      return $dataProvider;
    }
    return $dataProvider;
  }  

}

我建议您使用以下最佳方式,其中您无需添加诸如where或andWhere的额外条件

    public function actionIndex()
{
    $searchModel = new SubjectSearch();
    $queryData = Yii::$app->request->queryParams;
     $conditionData = [\yii\helpers\StringHelper::basename(($searchModel) => ['IN','subjectID'],[1,2,3]];
     $searchData = array_merge_recursive($queryData, $conditionData);
    $dataProvider = $searchModel->search($searchData);

    return $this->render('index', [
        'searchModel' => $searchModel,
        'dataProvider' => $dataProvider,
    ]);
}

这段代码对我来说非常顺利。 希望对您有帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM