2013-07-12 4 views
1

J'ai quatre tables dans ma base de données comme montré (user, user_test, test, status). Il y a un M: M à la relation entre l'utilisateur et le test et donc user_test est un Gerund entre eux. La table de statut a des états pour les tables user_test et test. Le champ tablename dans la table d'état indique à quelle table appartient l'état comme indiqué dans l'image inférieure.Comment ajouter où dans Yii méthode de recherche de modèle?

Je souhaite afficher la table user_test dans un CGridView avec les données associées dans les trois tables user, test et status. Tout va bien car les relations sont correctes.

Problème: Quand je veux montrer status.name dans mon CGrid comme:

array(
    'header'=>'Status', 
    'value'=>'$data->status->name', 
), 

Il me donne le nom « complété », mais il est l'état de la table « test » et le bon doit être ' confirmé 'comme status_id dans user_test est 2.

Une aide?

Database design Status table

public function search() 
{ 
    // Warning: Please modify the following code to remove attributes that 
    // should not be searched. 

    $criteria=new CDbCriteria; 
    $criteria->with=array('user','test','status'); 

    $criteria->compare('id',$this->id); 
    $criteria->compare('user_id',$this->user_id); 
    $criteria->compare('test_id',$this->test_id); 
    $criteria->compare('status.id',$this->status_id); 
    $criteria->compare('bonus',$this->bonus); 
    $criteria->compare('user.signum',$this->signum, FALSE); 
    $criteria->compare('user.email',$this->email, FALSE); 
    $criteria->compare('test.seats',$this->seats, FALSE); 

    return new CActiveDataProvider($this, array(
     'criteria'=>$criteria, 
     'sort'=>array(
      'attributes'=>array(
       'signum'=>array(
        'asc'=>'user.signum', 
        'desc'=>'user.signum DESC', 
       ), 
       'email'=>array(
        'asc'=>'user.email', 
        'desc'=>'user.email DESC', 
       ), 
       'seats'=>array(
        'asc'=>'test.seats', 
        'desc'=>'test.seats DESC' 
       ), 
       '*', 
      ), 
     ), 
    )); 
} 

MISE À JOUR: relations sont ici:

//UserTest 
.... 
return array(
     'status' => array(self::BELONGS_TO, 'Status', 'status_id'), 
     'test' => array(self::BELONGS_TO, 'Test', 'test_id'), 
     'user' => array(self::BELONGS_TO, 'User', 'user_id'), 
     'testtimeslots'=>array(self::BELONGS_TO, 'TestTimeslots','timeslots_id'), 
    ); 


// Test 
    return array(
     'testType' => array(self::BELONGS_TO, 'TestType', 'test_type_id'), 
     'status' => array(self::BELONGS_TO, 'Status', 'status_id'), 
     'testCriterias' => array(self::HAS_MANY, 'TestCriteria', 'test_id'), 
     'testTimeslots' => array(self::HAS_MANY, 'TestTimeslots', 'test_id'), 
     'userTests' => array(self::HAS_MANY, 'UserTest', 'test_id'), 
    ); 


    // User 
    return array(
     'userLanguages' => array(self::HAS_MANY, 'UserLanguage', 'user_id'), 
     'userTests' => array(self::HAS_MANY, 'UserTest', 'user_id'), 
    ); 

    // Status 
    return array(
     'tests' => array(self::HAS_MANY, 'Test', 'status_id'), 
     'userTests' => array(self::HAS_MANY, 'UserTest', 'status_id'), 
    ); 

MISE À JOUR: La sql Je veux générer est:

 SELECT * FROM user_test AS UserTest 
      INNER JOIN user ON user.id=UserTest.user_id 
      INNER JOIN test on test.id=UserTest.test_id 
      INNER JOIN (SELECT status.value, name from status where status.tablename='user_test') AS Status ON (Status.value = UserTest.status_id) 
+0

Vous devez également nous montrer comment les relations sont définies. – Jon

+0

Je précise une fois de plus que je compare userTest.status_id avec status.value (NOT status.id). – Ali

+0

Une fois la solution trouvée, j'utilise une fonction à l'intérieur du modèle. Statut: public function StatusName() \t { \t \t $ id = $ this-> status_id; \t \t $ model = État :: modèle() -> find ("tablename = 'test_utilisateur' AND valeur = $ id"); \t return $ model-> name; \t} puis dans mon Cgridview je récupérai la valeur comme: array ( \t \t \t \t \t \t 'tête' => 'Status', \t \t \t \t \t \t 'value' => '$ data-> StatusName() ', \t \t \t \t \t), – Ali

Répondre

0
$criteria=new CDbCriteria; 
$criteria->condition="user_name='john' and user_status='active'"; 
Questions connexes