2013-07-12 52 views
1

我在我的數據庫中有四個表(如user,user_test,test,status)。用戶和測試之間存在M:M關係,因此user_test是它們之間的Gerund。 狀態表具有user_test和測試表的狀態。狀態表中的表名字段顯示狀態屬於哪個表,如下圖所示。如何添加Yii模型搜索方法的位置?

我想在CGridView中顯示錶user_test與所有三個表user,test和status中的相關數據。一切都很好,因爲這種關係是正確的。

問題:當我想表明status.name我喜歡CGRID:

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

它給了我的名字「完成」,但它是表「測試」的狀態,正確的應該是「確認'as user_test中的status_id是2.

任何幫助?

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

UPDATE: 關係在這裏:

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

更新:我要生成的SQL是:

 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

你也應該告訴我們的關係是如何定義的。 – Jon

+0

我再次澄清,我正在比較userTest.status_id與status.value(NOT status.id)。 – Ali

+0

一旦解決方案,我想到目前爲止,我使用了模型內的功能狀態:公共職能StatusName() \t { \t \t $ id = $ this-> status_id; $ model = Status :: model() - > find(「tablename ='user_test'AND value = $ id」); \t return $ model-> name; \t},然後在我的Cgridview我檢索到的值,如:陣列( \t \t \t \t \t \t '標題'=> '狀態', \t \t \t \t \t \t '值'=>'$ DATA-> StatusName ()', \t \t \t \t \t), – Ali

回答

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