2016-08-26 55 views
2

我正在使用yii 2,我寫了查詢來從表中使用andWhere和orWhere獲取記錄,但結果令人困惑。讓我告訴你我面臨的問題。 我的查詢是混淆使用Yii 2查詢bulider和其中,或者哪裏?

Mission::find()->where(['IN', 'id', $ids])->orWhere(['created_by' => $user->id])->activeOrCancel()->all() 

活性或取消()在模型

public function activeOrCancel() 
{ 
    $this->andWhere(['status' => '1']); 
    $this->orWhere(['status' => 'cancel']); 
    return $this; 
} 

被定義當調試,並檢查了SQL查詢。我因此得到了這一點: -

SELECT * FROM `tbl_mission` WHERE (((0=1) OR (`created_by`=75)) AND (`status`='1')) OR (`status`='cancel') 

我怎樣才能得到這種結果的

SELECT * FROM `tbl_mission` WHERE ((0=1) OR (`created_by`=75)) AND ((`status`='1') OR (`status`='cancel')) 

回答

2

activeOrCancel()條件可寫入如下:

status IN ('1', 'cancel') 

這樣你可以重寫你的activeOrCancel這個功能:

public function activeOrCancel() 
{ 
    $this->andWhere(['status' => ['1', 'cancel']]); 
    return $this; 
} 

除了可以重寫第一條件爲:

->where(['or', 'id' => $ids, 'created_by' => $user->id]) 

因此組合兩個:

Mission::find() 
    ->where((new Query())->where(['or', 'id' => $ids, 'created_by' => $user->id])->where) 
    ->activeOrCancel() 
    ->all(); 
+0

我會在星期一嘗試。讓我們看看它對我有用。我還有一個功能,我沒有在這裏提到。 notDeleted()這也將被添加到我的查詢中。 yii生成的sql查詢正在爲我創建問題。 –

2

使用中間查詢對象到組的條件。 例如:

$queryPart1 = (new Query) 
    ->andWhere(['IN', 'id', $ids]) 
    ->orWhere(['created_by' => $user->id]); 

$queryPart2 = Mission::find() 
    ->activeOrCancel(); 

$result = Mission::find() 
    ->andWhere($queryPart1->where) 
    ->andWhere($queryPart2->where) 
    ->all(); 

:這是簡單的情況下(沒有查詢參數)。 關於合併查詢的更多信息:Yii2 merge queries like cdbcriteria in yii1