如何在 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 不适用于过滤器。
顺便说一句,真正的问题是使用多对多关系进行搜索。
许多用户到许多组。
多个组对应多个主题。
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);
导致 "Array to string conversion" 错误。
$searchModel = new SubjectSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
$dataProvider->query->andFilterWhere(['in','subjectID',[1,2]]);;
这个方法果然奏效了。
顺便说一句,您对处理多对多搜索有什么建议吗?
每次调用搜索都会得到一个新的查询对象,所以不能给它添加参数,使用这个方法:
$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 调试器中,此查询已更改为:
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;
}
}
我建议您使用以下的最佳方式,您不需要添加一些额外的条件,例如 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,
]);
}
这段代码对我来说非常顺利。希望对你也有帮助
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);
导致 "Array to string conversion" 错误。
$searchModel = new SubjectSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
$dataProvider->query->andFilterWhere(['in','subjectID',[1,2]]);;
这个方法果然奏效了。 顺便说一句,您对处理多对多搜索有什么建议吗?
每次调用搜索都会得到一个新的查询对象,所以不能给它添加参数,使用这个方法:
$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 调试器中,此查询已更改为:
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;
}
}
我建议您使用以下的最佳方式,您不需要添加一些额外的条件,例如 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,
]);
}
这段代码对我来说非常顺利。希望对你也有帮助