2012-11-20 25 views
2

我對DB查詢不太好。而Yii則更加複雜,因爲我不太習慣它。 我需要優化的簡單查詢Yii查詢優化MySQL

$userCalendar = UserCalendar::model()->findByAttributes(array('user_id'=>$user->id)); 
    $unplannedEvents = CalendarEvent::model()->findAllByAttributes(array('calendar_id'=> $userCalendar->calendar_id,'planned'=>0)); 

CalendarEvent表,即,從我需要記錄不具有USER_ID但CALENDAR_ID從中我可以從UserCalendar得到USER_ID第二個表,即第一臺所以我據我所知,創建了一個UserCalendar對象,這不是一個很好的方法。

Q1。我能做些什麼來合併成一個。問題二:
Q2。 Yii在內部完成了這一切,但我想知道它在MySQL(phpMyAdmin)中單獨嘗試建立的查詢,有沒有辦法做到這一點?
謝謝。

回答

2

Q1:您需要在兩個活動記錄模型(在「關係」方法中)中定義UserCalendar和CalendarEvent之間的關係。

根據您的意見,看起來好像您的日曆模型具有CalendarEvent模型和UserCalendar模型。 讓我們假設你的關係,在日曆是:

relations() { 
    return array( 
     'userCalendar' => array(self::HAS_MANY, 'UserCalendar', 'calendar_id'), 
     'calendarEvent' => array(self::HAS_MANY, 'CalendarEvent', 'calendar_id'), 
} 

在CalendarEvent:

relations() { 
    return array('calendar' => array(self::BELONGS_TO, 'Calendar', 'calendar_id'),); 
} 

而且在UserCalendar:

relations() { 
     return array('calendar' => array(self::BELONGS_TO, 'Calendar', 'calendar_id'),); 
    } 

因此,爲了使UserCalendar之間的聯繫和CalendarEvent你需要使用日曆

$criteria = new CDbCriteria; 
$criteria->with = array(
    "calendarEvent"=>array('condition'=>'planned = 0'), 
    "userCalendar"=>array('condition'=> 'user_id =' . $user->id), 
); 
$calendar = Calendar::model()->find($criteria); 

$calendar->calendarEvent將返回屬於用戶的calendarEvent的陣列

Q2:您可以啓用網頁記錄,以便所有的數據庫請求(和其他東西)會出現在頁面的末尾: Logging in Yii (see CWebLogging)

在您的應用程序配置把

'components'=>array(
     ...... 
     'log'=>array(
      'class'=>'CLogRouter', 
      'routes'=>array(
       array(
        'class'=>'CWebLogRoute', 

       ), 
      ), 
     ), 
    ), 
+0

主動記錄類有希望的relations.In CalendarEvent公共職能關係() \t { \t \t返回陣列( \t \t \t '日曆'=>數組(自:: belongs_to的, '日曆', 'CALENDAR_ID'), \t \t); \t}和在UserCalendar \t公共函數關係() \t { \t \t返回陣列( \t \t \t '日曆'=>數組(自:: belongs_to的, '日曆', 'CALENDAR_ID'), \t \t \t 'user'=> array(self :: BELONGS_TO,'User','user_id'), \t \t); \t}您的查詢似乎無效。而對於日誌記錄,我無法看到記錄的消息在哪裏。 –

+0

我 '登錄'=>數組( \t \t \t '類'=> 'CLogRouter', \t \t \t '路線'=>數組( \t \t \t \t陣列( \t \t \t \t \t '類' => 'CFileLogRoute', \t \t \t \t \t '水平'=> '錯誤,警告信息', \t \t \t \t),在我的main.php中,但我的webapp目錄中沒有CFileLogRoute。請詳細說明您的答案。謝謝。 –

+0

對於日誌路徑,我認爲日誌文件所在的文件夾「運行」(例如在我的應用我有一個文件application.log)您可以在與該網頁顯示日誌創建: 陣列(「類」 => 'CWebLogRoute'), – darkheir