Yii CDbCriteria加入的小问题

时间:2014-04-21 18:22:43

标签: php mysql activerecord yii criteria

我有以下表格 aliados(主表和我尝试从中检索记录的那个)。 aliados_direccion,它将aliados_id作为外键 aliados_centro_medico也将aliados_id作为外键,并使下表中的Many_Many关系成为可能。 centro_medico。

在aliados_direccion和centro_medico中,有一个名为" parroquias_id"的列。它来自一个对此查询不重要的不同表。

我试图让网格向我展示一些" aliados"如果他们有一个aliados_direccion或与他们相关的aliados_centro_medico,其中aliados_direccion.parroquias_id或centro_medico.parroquias_id位于一个依赖于登录用户的数组中。

数组很好,mysql读取没有问题,问题出在实际查询中。

$criteria=new CDbCriteria;
$criteria->select='a.*';
$criteria->alias='a';
$criteria->join='RIGHT JOIN (SELECT dir.* FROM aliados_direccion dir
              WHERE dir.parroquias_id IN ('.$zonas.')) ad ON ad.aliados_id=a.id';
$criteria->join='RIGHT JOIN (SELECT many.* FROM aliados_centro_medico many
                        INNER JOIN (SELECT centro_medico.id as idCM
                                              FROM centro_medico
                                              WHERE centro_medico.parroquias_id
                                              IN ('.$zonas.')) cm
                                    ON cm.idCM = many.centro_medico_id) acm
                  ON acm.mAlId = a.id';
$criteria->compare(blahblahblah);
//BTW $zonas is the array that I previously built

这里发生的是网格将显示所有记录或不显示任何记录,具体取决于我是使用左连接还是右连接。 我也试过使用关系的别名,比如>

if($this->aliados_direccion){
//First Criteria Join
elseif($this->aliados_centro_medico){
//Second Criteria Join
}

但是当我这样做时,即使我使用INNER JOIN,它仍然会给我带来所有记录。

2 个答案:

答案 0 :(得分:1)

您接下来替换了第一次加入。

$criteria->join='RIGHT JOIN (SELECT dir.* FROM aliados_direccion dir
          WHERE dir.parroquias_id IN ('.$zonas.')) ad ON ad.aliados_id=a.id';
$criteria->join='RIGHT JOIN (SELECT many.* FROM aliados_centro_medico many
                    INNER JOIN (SELECT centro_medico.id as idCM
                                          FROM centro_medico
                                          WHERE centro_medico.parroquias_id
                                          IN ('.$zonas.')) cm
                                ON cm.idCM = many.centro_medico_id) acm
              ON acm.mAlId = a.id';

加入是CDbCriteria字段,因此您需要将它们组合起来

$criteria->join='RIGHT JOIN (SELECT dir.* FROM aliados_direccion dir
          WHERE dir.parroquias_id IN ('.$zonas.')) ad ON ad.aliados_id=a.id
          RIGHT JOIN (SELECT many.* FROM aliados_centro_medico many
                    INNER JOIN (SELECT centro_medico.id as idCM
                                          FROM centro_medico
                                          WHERE centro_medico.parroquias_id
                                          IN ('.$zonas.')) cm
                                ON cm.idCM = many.centro_medico_id) acm
              ON acm.mAlId = a.id';

答案 1 :(得分:0)

所以,这就是答案...... 我必须创建$ zonas数组,我已经在做一个完成查询的sql语句,就像这样......

$zonas = 'SELECT z.parroquias_id
          FROM m_zona_mercadeo z, m_tipo_zona_mercadeo t, m_rrhh r
          WHERE r.usuario_id = '.$user->id.'
          AND r.tipo_zona_id = t.id AND t.id = z.tipo_zona_id';

查询结果如下:

$criteria=new CDbCriteria;
$criteria->select='a.*';
$criteria->alias='a';
$criteria->join='INNER JOIN (SELECT ad.aliados_id
                             FROM aliados_direccion ad
                             WHERE ad.parroquias_id IN ('.$zonas.')
                 UNION
                             SELECT acm.aliados_id
                             FROM aliados_centro_medico acm, centro_medico cm
                             WHERE cm.id = acm.centro_medico_id
                             AND cm.parroquias_id IN ('.$zonas.')) u
                 ON u.aliados_id = a.id';