2010-12-06 11 views
3

Ich habe 3 Tabellen, standart Beziehung many-to-many Benutzer (id, ...) -> Users_Has_Courses (Users_id, Courses_id) -> Kurse (id, ...)Erste Daten mit CActiveDataProvider in yii

Kurse Modell hat nächste Beziehung

'users' => array(self::MANY_MANY, 'Users', 'users_has_courses(Courses_id, Users_id)') 

Benutzer Modell

'courses' => array(self::MANY_MANY, 'Courses', 'users_has_courses(Users_id, Courses_id)') 

Bitte nächste Beziehung hat, zu sagen, wie ich Liste der Kurse bekommen, auf die Benutzer mit dem angegebenen „id“ nicht abonnierte mit CAct iveDataProvider? anderen Worten, ich brauche einen analogen dieser Ebene SQL-Abfrage

select * from Courses where id not in (select Courses_id from users_has_courses where Users_id = 2) 

Dank für die Hilfe

Antwort

5

Statt einer normalen „Beziehung“, versuchen Sie eine parametrisierte Named Scope die Abfrage zu verkapseln. In Ihrem Kurs Modell, fügen Sie diese Scope-Funktion eine Liste aller Kurse erhalten die Benutzer nicht in:

public function userNotIn($user_id) 
{ 
    $criteria=new CDbCriteria(); 
    $criteria->condition .= 't.id NOT IN (SELECT users_has_courses.Courses_id FROM users_has_courses WHERE users_has_courses.Users_id = :userid)'; 
    $criteria->params[':userid'] = $user_id; 
    $this->getDbCriteria()->mergeWith($criteria); 
    return $this; 
} 

Dann sollten Sie in der Lage sein, dies zu tun:

$coursesNotIn=new CActiveDataProvider(Courses::model()->userNotIn($user->id)); 

Dieser Code ist komplett ungeprüft, aber es sollte prinzipiell funktionieren. Ich mache so etwas oft, wenn ich eine komplexe Abfrage habe, aber ich möchte immer noch die AR-Funktionen wie CActiveDataProvider verwenden. Lesen Sie mehr über "Scopes" hier:

http://www.yiiframework.com/doc/guide/1.1/en/database.ar#parameterized-named-scopes

Viel Glück!