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