2017-06-05 95 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