简体   繁体   English

Yii CDbCriteria加入的小问题

[英]Little issue with Yii CDbCriteria Joins

I have the following tables aliados (Main table and the one I'm trying to retrieve records from). 我有以下表别名(主表和我要从中检索记录的表)。 aliados_direccion which has aliados_id as a foreign key aliados_centro_medico which also has aliados_id as a foreign key and makes possible a Many_Many relation with the following table. aliados_direccion具有aliados_id作为外键aliados_centro_medico也具有aliados_id作为外键,并使得与下表的Many_Many关系成为可能。 centro_medico. centro_medico。

In aliados_direccion and in centro_medico there's a column called "parroquias_id" which comes from a different table that has no importance for this query. 在aliados_direccion和centro_medico中,有一个名为“ parroquias_id”的列,该列来自于对该查询不重要的其他表。

I'm trying to get the grid to show me some "aliados" if they have an aliados_direccion or an aliados_centro_medico related to them where the aliados_direccion.parroquias_id or the centro_medico.parroquias_id is in an array that depends on the user that is logged in. 我正在尝试使网格向我显示一些“别名”,如果它们具有与它们相关的aliados_direccion或aliados_centro_medico,其中aliados_direccion.parroquias_id或centro_medico.parroquias_id位于依赖于登录用户的数组中。

The array is fine and mysql reads it without a problem, the issue is in the actual query. 该数组很好,并且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

What happens here is the grid will either show me all records or none, depending on whether I use left or right join. 在这里发生的是,网格将显示全部记录或不显示所有记录,具体取决于我使用的是左联接还是右联接。 I tried using the relation's alias too, like> 我也尝试使用关系的别名,例如>

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

But when i do that it will still bring me all records, even if i use INNER JOIN instead. 但是当我这样做时,即使我改用INNER JOIN,它仍然会带给我所有记录。

You replaced first join by next. 您将“第一联接”替换为“下一步”。

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

Join is CDbCriteria field, so you need to combine them Join是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';

So, this was the answer... I had to make the $zonas array which I was already doing as a sql statement that would complete the query, like this... 所以,这就是答案。。。我必须将$ 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';

And the query ended up like this: 查询最终如下所示:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM