2015-08-27 77 views
0

我知道这个问题可能会提前问及我已经应用了那里提到的修复程序,但它们不工作。左连接在活动记录中不显示空记录Yii

这里是我的问题:

我有,我想加入,并获得满意的结果两个表。

  1. 任务(ID,状态,task_type_id)
  2. task_type(ID,task_type_name)

有一个对任务task_type之间一对多的关系。

我的要求:

我想所有的用户已经创建了通过task_type_id,目前未完成分组的任务。

这是我曾尝试:

$criteria = new CDbCriteria(); 
    $criteria->select = "t.*, t2.task_type_id,count(t2.task_type_id) as total"; 
    $criteria->join = "LEFT JOIN task t2 on t.id=t2.task_type_id"; 
    $criteria->condition = "t.user_id=" . $user_id . " OR t.user_id is NULL"; 
    $criteria->addCondition("t2.user_id=" . $user_id); 
    $criteria->addCondition("t2.status='Incomplete'"); 
    $criteria->group = "t.id"; 
    $criteria->order = 'total desc'; 
    $task_types = TaskType::model()->findAll($criteria); 

它返回的一切正确的,但task_type表的空值不显示。即它只显示任务确实存在的task_type。它不显示task_type不存在的task_type。我想要任务存在或不存在的所有task_types。

有人可以建议修复吗?我使用了左连接,它应该返回两种类型的task_types,但它不起作用。

+0

看起来您需要使用LEFT JOIN并将WHERE更改为AND – Madhivanan

+0

已经使用了LEFT JOIN以及在哪里更改'where'?条件属性被转换为活动记录中的哪个位置 – Hammad

回答

0

更新与后来的语句之后

$criteria->condition = "t.user_id=" . $user_id . " OR t.user_id is NULL"; 

$criteria->condition = "COALESCE(t.user_id,1)=" . COALESCE($user_id,1). "; 
0

在T2的条件,后左侧激活加入。将它们更改为Left Join On子句的一部分,因此如果它们不符合,它们将不会从数据集中删除该记录。