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?
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)
Vous devez également nous montrer comment les relations sont définies. – Jon
Je précise une fois de plus que je compare userTest.status_id avec status.value (NOT status.id). – Ali
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