Yii由另一个表CActiveDataProvider命令

时间:2011-03-14 20:16:48

标签: yii

我对此感到有点难过。基本上我有两张桌子:

网页:

  • ID
  • 名称

点数:

  • id-
  • 的pageid

我希望从 Page 表中获取记录,并按 Points 表中的点数(点数字段)对其进行排序

目前我有:

$dataProvider=new CActiveDataProvider('Page',array(
        'criteria'=>array(
            'condition'=>"active = 1 AND userid IN (".$ids.")",
            'order'=>"???",
        ),

        'pagination'=>array(
            'pageSize'=>30,
        ),
    ));

我只是不知道如何通过相关记录的 Points 表值对其进行排序 我已经为 Page / Points 表建立了一个关系,如下所示:

(在页面模型中)

'pagepoints' => array(self::HAS_ONE, 'Points', 'pageid'),

由于

3 个答案:

答案 0 :(得分:4)

你需要做两件事:

  1. pagepoints关系添加到查询条件的with部分
  2. 在条件的order部分中引用您要排序的列
  3. 我在下面的代码中标出了发生这种情况的行:

    $dataProvider = new CActiveDataProvider('Page', array(
        'criteria'=>array(
            'with' => array('pagepoints'),  // #1 
            'condition' => 'active = 1 AND userid IN ('.$ids.')',
            'order' => 'pagepoints.points', // #2
        ),
    
        'pagination'=>array(
            'pageSize'=>30,
        ),
    ));
    

    要了解其工作原理,您需要了解的是,当Yii构建SQL查询(LEFT OUTER JOINPoints表)时,它会使用您为该关系提供的名称。 Page模型(您为此定义,它是pagepoints)来为连接表添加别名。换句话说,查询看起来像:

    SELECT ... FROM Page ... LEFT OUTER JOIN `Points` `pagepoints` ...
    

    以下是排序顺序的正确规范是pagepoints.pointspagepoints是表别名,points是该表中的列。

答案 1 :(得分:1)

尝试以下

$dataProvider=new CActiveDataProvider('Page',array(
        'criteria'=>array(
            'with'=>array('pagepoints'),
            'condition'=>"active = 1 AND userid IN (".$ids.")",
            'order'=>"t.points DESC",
        ),

        'pagination'=>array(
            'pageSize'=>30,
        ),
    ));

答案 2 :(得分:0)

这是你想要生成的sql:

  

从页面内部连接点中选择*   在page.id = points.page_id order by   points.points desc