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

标签 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->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 无法与过滤器一起使用。

顺便说一句,真正的问题是使用多对多关系进行搜索。

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

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

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

最佳答案

你不会相信,今天我也陷入了同样的境地。 我认为 IN 会按照我想要的方式工作。但是,奇怪的是,这对我不起作用。

我试过了。

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

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

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

然后,我将查询更改为

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

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

SELECT * FROM tableName WHERE (condition) 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;
  }  

}

关于php - 如何在 Yii2 搜索模型中使用数组进行搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41932653/

相关文章:

php - MYSQL Like 只查询关键字匹配大小写

javascript - 一次输入两种形式

mysql - Yii2 迁移以增加列长度

html - Yii2 URL Html 格式

many-to-many - Symfony2-学说 : ManyToMany relation is not saved to database

php - laravel 8 中扩展模型的工厂

php - 查询未按顺序返回

php - 在 null 上调用成员函数 getDb()

mysql - Symfony 中的多对多和多对一关系

Django 从多对多关系中删除对象