2011-03-14 67 views
3

我對此有點難住。基本上,我有兩個表:Yii由另一個表訂購CActiveDataProvider

頁:

  • ID

點:

  • ID-
  • 的pageid

我希望得到來自表中的記錄,並通過它在表(點場)點

量對其進行排序

目前我有:

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

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

我只是不知道如何被噸對它進行排序對於相關記錄 我已成立了頁的關係能值/點表所示:

(在頁面模型)

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

感謝

回答

3

您需要做兩件事:

  1. pagepoints關係添加到的查詢條件with部分
  2. 參考你想在該標準的order部分排序的列

我已經打上下這個現象發生在線路下面的代碼:

$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

請嘗試以下

$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, 
     ), 
    )); 
+0

酷,謝謝對你們倆。我試過這兩種方法,我忘了說這兩個表都有字段「userid」和「created」,現在我得到錯誤「列'userid'在where子句是不明確的」,我的理解是因爲它使用兩個表中的重複名稱。有沒有簡單的方法來解決這個問題?或者只是重新命名數據庫中的字段更容易? – 2011-03-16 19:55:25

+0

@ eskim0 - 嘗試t.userid – Roland 2011-03-17 12:02:18

0

這是你想要生成SQL:

SELECT * FROM內頁的連接點 上page.id = points.page_id爲了通過 points.points遞減