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

Php 如何在Yii2搜索模型中使用数组进行搜索,php,yii2,many-to-many,yii2-model,Php,Yii2,Many To Many,Yii2 Model,我尝试过不同的方法,如 public function actionIndex() { $searchModel = new SubjectSearch(); $searchModel->search()->query->andFilterWhere(['in','subjectID',[1,2,3]]); $dataProvider = $searchModel->search(Yii::$app->request->queryPar

我尝试过不同的方法,如

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,
    ]);
}
但它们不适合我

实际上,在这种情况下,ArrayDataprovider似乎是一个更好的解决方案,但ArrayDataprovider不能与过滤器一起工作

顺便说一句,真正的问题是搜索与许多关系

多用户多组。
多组多主题。

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

我正试图通过以下方式做到这一点:

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

$searchModel->search()->query->andFilterWhere(['in','subjectID',[1,2,3]]);
但这不起作用,肯定不是一个好方法

请帮我一点忙

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

$groups = $appUser->getGroups();
$subjectIDs = [];
foreach ($groups as $group) {
    $subjectIDs[] = $group->getSubjectIDs
}
$searchModel = new SubjectSearch();
$searchModel->subjectID = $subjectIDs;
导致“数组到字符串转换”错误

这种方法确实有效。
顺便说一句,您对如何处理多对多搜索有什么建议吗?

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

    $searchModel = new SubjectSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
    $dataProvider->query->andFilterWhere(['in','subjectID',[1,2]]);;
在SubjectSearch模型中,搜索功能中应包含以下内容:

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

你不会相信今天我也陷入了同样的境地。 我认为中的
将按我所希望的方式工作。但奇怪的是,这对我不起作用

我试过了。

在Yii调试器中,此查询更改为:

从tableName中选择*,其中(condition)和(subjectID='1,2')

然后,我将查询改为

$dataProvider->query->andFilterWhere(['IN','subjectID', $this->subjectID]);
并且,在Yii调试器中检查时,查询自动更改为:

从表名中选择*,其中(条件)和(主语为('1,2'))

我一直在找

更新代码

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

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

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

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

我建议你最好使用下面的方法,你不需要添加一些额外的条件,比如where或andWhere

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;
  }  

}

这个代码对我来说非常顺利。我希望它也能帮助你

真奇怪。我认为$searchModel->subjectID=[1,2,3];事情根本不起作用。他们只是归还一切。我稍后再试试,看看我有没有做错什么对不起。你们都回答了我的问题,但Ed209早就回答了。因此,我将选择他的答案。如何为不同的列设置两个条件?在数组中添加其他索引,如:$conditionData=[\yii\helpers\StringHelper::basename(($searchModel)=>['in','studentid',[1,2]]
public function actionIndex(){
    $searchModel = new SubjectSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

    return $this->render('index', [
        'searchModel' => $searchModel,
        'dataProvider' => $dataProvider,
    ]);
}
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;
  }  

}
    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,
    ]);
}