Yii2将findBySql查询转换为QueryBuilder查询

时间:2017-06-05 21:46:33

标签: php sql oracle gridview yii2

我使用findbysql进行以下查询:

$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时它不会排序。根据{{​​3}},我似乎需要使用查询构建器。

所以我试图用我的查询的第一部分(在联合之前)做到这一点,它看起来像这样:

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

但是,我的查询在yii中显示如下,显然oracle不接受列名称的双引号:

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

我知道这里的查询可能不正确,但我甚至无法获得双引号消失。尝试用yii docs建议的多种方式定义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")

我还尝试从文档中加入这样的查询:Sort and search column when I'm querying with findbysql in yii2

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

但是它也抱怨说它并没有认出你而且查询反而在yii中出现了:

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

此时我只是在寻找构建此查询的最简单方法(无论是使用querybuilder还是其他方式),以便我可以将查询传递给gridview并对其进行排序。

1 个答案:

答案 0 :(得分:0)

我建议您首先从查询所需的表格中创建所需的所有数据模型,使用Gii它应该很容易,甚至可以创建您需要的关系。

之后,您可以执行以下操作:

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

这样您就不需要提供表别名或添加关系工作所需的条件。