2017-06-05 94 views
0

我已經使用findbysql以下查詢:Yii2翻譯findBySql查詢到的QueryBuilder查詢

$query = Users::findBySql('select a.user_id, a.last_name,a.first_name, a.emp_id, ar.role_id from auth_users a, auth_user_roles AR, AUTH_USER_DEPTS AD, DEPARTMENTS D 
       where AD.DEPT_ID = D.DEPT_ID AND AR.USER_ID = AD.USER_ID and a.user_id = ar.user_id 
       AND D.DEPT_GROUP_ID = :dept_group_id AND (ACCESS_END_DATE > SYSDATE OR ACCESS_END_DATE IS NULL) 
       UNION 
       SELECT DISTINCT a.user_id, a.last_name, a.first_name, a.emp_id, NULL AS role_id FROM auth_users a, AUTH_USER_ROLES AR, AUTH_USER_DEPTS AD, DEPARTMENTS D 
       WHERE AD.DEPT_ID = D.DEPT_ID AND AR.USER_ID = AD.USER_ID and a.user_id = ar.user_id 
       AND D.DEPT_GROUP_ID = :dept_group_id AND 
       AR.ACCESS_END_DATE < SYSDATE AND AR.USER_ID NOT IN (select USER_ID from auth_user_roles where ACCESS_END_DATE > SYSDATE OR ACCESS_END_DATE IS NULL)', [':dept_group_id' => $dept_group_id ]); 

這查詢不正是我想要的,但問題是,當我試圖把它變成它一個gridview不排序。根據Sort and search column when I'm querying with findbysql in yii2它看起來像我需要使用查詢生成器來代替。

所以我試圖做到這一點與我的查詢的第一部分(前盟),它看起來像這樣:

$query1 = (new \yii\db\Query()) 
     ->select(['user_id', 'last_name', 'first_name', 'emp_id']) 
     ->from('AUTH_USERS'); 
    $query2 = (new \yii\db\Query()) 
     ->select('USER_ID') 
     ->from('AUTH_USER_ROLES') 
     ->where('ACCESS_END_DATE>SYSDATE OR ACCESS_END_DATE IS NULL'); 
    $query = $query1->innerJoin('AUTH_USER_DEPTS', 'AUTH_USER_DEPTS.user_id = AUTH_USERS.user_id')->innerJoin('DEPARTMENTS', 'AUTH_USER_DEPTS.dept_id = DEPARTMENTS.dept_id'); 
    $query->innerJoin('AUTH_USER_ROLES', 'AUTH_USER_ROLES.USER_ID = auth_users.USER_ID')->where('ACCESS_END_DATE>SYSDATE OR ACCESS_END_DATE IS NULL'); 

但是,我查詢出來這樣的警予,顯然甲骨文不接受周圍的列名的雙引號:

SELECT "user_id", "last_name", "first_name", "emp_id" FROM "AUTH_USERS" 
INNER JOIN "AUTH_USER_DEPTS" ON AUTH_USER_DEPTS.user_id = AUTH_USERS.user_id 
INNER JOIN "DEPARTMENTS" ON AUTH_USER_DEPTS.dept_id = DEPARTMENTS.dept_id 
INNER JOIN "AUTH_USER_ROLES" ON AUTH_USER_ROLES.USER_ID = auth_users.USER_ID 
WHERE ACCESS_END_DATE>SYSDATE OR ACCESS_END_DATE IS NULL 

我知道的查詢可能是不正確的已經在這裏,但我甚至不能讓雙引號走開。試圖通過對警予文檔沒有成功定義的select語句多種方式建議已經:

select(['user_id', 'last_name', 'first_name', 'emp_id']) 
select('user_id', 'last_name', 'first_name', 'emp_id') 
select("user_id, last_name,first_name,emp_id") 

我自己也嘗試從文檔加入這樣的疑問:http://www.yiiframework.com/doc-2.0/guide-db-query-builder.html

$query = $query1->innerJoin(['u' => $query2], 'u.user_id = user_id'); 

但同時也抱怨說,它doesnèt識別U和查詢,而不是出來,像這樣在警予:

SELECT COUNT(*) FROM "AUTH_USERS" INNER JOIN "AUTH_USER_DEPTS" ON AUTH_USER_DEPTS.user_id = AUTH_USERS.user_id INNER JOIN "DEPARTMENTS" ON AUTH_USER_DEPTS.dept_id = DEPARTMENTS.dept_id INNER JOIN (SELECT "USER_ID" FROM "AUTH_USER_ROLES" WHERE ACCESS_END_DATE>SYSDATE OR ACCESS_END_DATE IS NULL) "u" ON u.user_id = auth_users.user_id 

在這一點上我只是在尋找以卜的最簡單方法ild這個查詢(無論是使用querybuilder或其他方式),以便我可以將查詢傳遞給我的gridview並對其進行排序。

回答

0

我建議你先從查詢所需的表格中創建所需的所有數據模型,使用Gii它應該很容易,甚至可以創建你需要的關係。

之後,你可以這樣做以下:

$query = Users::find() 
    ->joinWith('theRelation1Name') 
    ->joinWith('theRelation2Name') 
    ->joinWith('theRelation3Name') 
    ... 

這樣,您就不需要給表的別名或添加所需關係工作的條件。

+0

似乎訂購任何與工會的查詢現在被打破:https://github.com/yiisoft/yii2/issues/12968結束了只是分裂成2個單獨的查詢,並選擇一個傳入基於一些標準的gridview在視圖中 – user3504410