2017-01-30 30 views
1
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, 
    ]); 
} 

我已經嘗試了不同的方式像
如何在Yii2搜索模式的陣列

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

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

搜索但他們並沒有爲我工作。

實際上,在這種情況下ArrayDataprovider似乎是更好的解決方案,但Array Dataprovide不能用於過濾器。

順便說一句,真正的問題是使用ManyToMany關係進行搜索。

許多用戶爲許多組。
許多小組對許多主題。

UserGroupTbl包含用戶名和組ID
SubjectGroup包含SubjectID和羣ID

我試圖做到這一點與:

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

此方法實際上工作。 順便說一句,你有處理多次搜索的一些建議嗎?

回答

2

每次調用搜索,你會得到一個新的查詢對象,所以你不能參數添加到它,使用此方法時:

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

在SubjectSearch模型,你應該有這樣的搜索功能:

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

這很奇怪。我認爲$ searchModel-> subjectID = [1,2,3];事情根本不起作用。他們只是返回一切。我會稍後再嘗試,看看我是否做錯了 –

2

你不會相信今天我也陷入了同樣的情況。 我認爲IN將以我想要的方式工作。但是,奇怪的是沒有爲我工作。

我試過了。

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

在Yii的調試器,此查詢變更爲:

SELECT * FROM TABLENAME WHERE(條件)AND(subjectID = '1,2')...

然後,我改變了我的查詢

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

而且,在Yii的調試檢查,查詢已自動更改爲:

SELECT * FROM表名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; 
    } 

} 
+0

對不起。你們都回答了我的問題,但Ed209早些時候回答。 所以我只是選擇他的答案。 –

0

我建議你使用以下中,你不需要添加等,其中或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, 
    ]); 
} 
一些額外的條件,最好的辦法

這段代碼對我來說非常順利。我希望它也能幫到你

+0

如何爲不同列設置兩個條件? – chatoxz

+1

在數組中添加其他索引,例如:$ conditionData = [\ yii \ helpers \ StringHelper :: basename(($ searchModel)=> ['IN','studentid'],[1,2]] – Dani