2012-09-24 73 views
4

如何將mysql查詢轉換爲yii。?查詢加入三個表yii

我有3個表

  1. user_header
  2. 客戶
  3. customer_ratings

,這是我的SQL查詢

SELECT t.email 
FROM otz_user_header t 
     JOIN otz_customers r 
     ON t.user_id = r.customer_user_id 
     JOIN otz_customer_ratings cr 
     ON cr.customer_user_id = r.customer_user_id 
WHERE r.rate_auto_approve = 0 
     AND r.rate_email_time IS NOT NULL 
     AND r.total_rating_count IS NOT NULL 
     AND cr.rating_date < Curdate() 
     AND cr.rating_date > Date_sub(Curdate(), INTERVAL 7 day) 

如何轉換此查詢警予?

在此先感謝。

+0

是什麼問題? – StaticVariable

+0

您可以直接在Yii中運行mysql語句。但是如果你想使用主動記錄方法,你可以參考Yii關於[關係活動記錄]的文檔(http://www.yiiframework.com/doc/guide/1.1/en/database.arr)。 –

+0

我不明白的一個問題。對於具有多個連接的複雜查詢,在任何基準測試中,活動記錄都比DAO慢。甚至yiis指南都提到它。就我之前很久以前,我總是發現它慢了一秒。但仍然有人選擇積極記錄....我在這裏錯過了什麼?即使查詢生成器比AR快。 – itachi

回答

10

「鼬」 的答案是對的,但如果你正在尋找ActiveRecord的方式...

型號:個UserHeader

關係:

'activeCustomers' => array(
    self::HAS_MANY, 
    'Customer', 
    'customer_user_id', 
    'condition' => 'activeCustomers.rate_auto_approve=0 
        AND activeCustomers.rate_email_time IS NOT NULL 
        AND activeCustomers.total_rating_count IS NOT NULL' 
), 

型號:客戶

關係:

'lastWeekRatings' => array(
    self::HAS_MANY, 
    'CustomerRating', 
    'customer_user_id', 
    'condition' => 'lastWeekRatings.rating_date < CURDATE() 
     AND lastWeekRatings.rating_date > DATE_SUB(CURDATE(), INTERVAL 7 DAY)' 
), 

和下面的代碼返回模型對象作爲與您的查詢。 (我沒有測試過)

$useremails = UserHeader::model() 
    ->with('activeCustomers', 'activeCustomers.lastWeekRatings') 
    ->findAll(array(
      'select' => 't.email' 
    )); 
print_r($useremails); 
+0

如何使用foreach語句訪問這些​​數據? – PinoyStackOverflower

+2

@ElsonSolano,findAll()總是返回一個數組(或數組訪問對象)。你可以通過foreach循環($ useremails爲$ userHeader),你可以訪問字段'$ userHeader-> email'和關係'$ userHeader-> activeCustomers'這是客戶記錄列表和'$ userHeader-> activeCustomers-> lastWeekRatings'這是CustomerRating對象的列表。 – SuVeRa

5

使用DAO(數據訪問對象

模型


public function test(){ 
     $sql = "SELECT t.email 
      FROM otz_user_header t 
      JOIN otz_customers r ON t.user_id = r.customer_user_id 
      JOIN otz_customer_ratings cr ON cr.customer_user_id = r.customer_user_id 
      WHERE r.rate_auto_approve =0 
      AND r.rate_email_time IS NOT NULL 
      AND r.total_rating_count IS NOT NULL 
      AND cr.rating_date < CURDATE() 
      AND cr.rating_date >DATE_SUB(CURDATE() , INTERVAL 7 
      DAY)"; 

     return Yii::app()->db->createCommand($sql)->queryAll(); 
      }