2

私はDBクエリが苦手です。Yii の場合は、あまり慣れていないので、もっと複雑です。単純なクエリを最適化する必要がある

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

CalendarEvent テーブル、つまり、レコードが必要な 2 番目のテーブルには user_id がありませんが、UserCalendar から user_id を取得できる calendar_id があります。つまり、最初のテーブルです。理解する。

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'), );
}

そして 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: Web ロギングを有効にして、すべての db リクエスト (およびその他のもの) がページの最後に表示されるようにすることができます: Yii でのロギング (CWebLogging を参照)

アプリケーション構成に入れます

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

                ),
           ),
        ),
    ),
于 2012-11-20T15:24:33.540 に答える