2

我不太擅长数据库查询。而使用 Yii 则更复杂,因为我不太习惯它。我需要优化一个简单的查询

   $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,我可以从中获取 user_id 从 UserCalendar,即第一个表,因此我创建了一个 UserCalendar 对象,就我而言这不是一个很好的方法理解。

Q1。我该怎么做才能使它合二为一。
Q2。Yii 在内部完成了这一切,但我想知道它构建了什么查询来在 MySQL(phpMyAdmin) 中单独尝试它,有没有办法做到这一点?
谢谢。

4

1 回答 1

2

Q1:您需要在两个活动记录模型中定义 UserCalendar 和 CalendarEvent 之间的关系(在“关系”方法中)。

根据您的评论,您似乎拥有具有 CalendarEvent 模型和 UserCalendar 模型的 Calendar 模型。假设您在日历中的关系是:

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

在日历事件中:

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

在用户日历中:

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

因此,要建立和之间的链接UserCalendarCalendarEvent您需要使用日历

$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:您可以启用 Web 日志记录,以便所有 db 请求(和其他内容)将出现在页面末尾: Logging in Yii(请参阅 CWebLogging)

在您的应用程序配置中放置

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

                ),
           ),
        ),
    ),
于 2012-11-20T15:24:33.540 回答