我在我的數據庫中有四個表(如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.
任何幫助?
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)
你也應該告訴我們的關係是如何定義的。 – Jon
我再次澄清,我正在比較userTest.status_id與status.value(NOT status.id)。 – Ali
一旦解決方案,我想到目前爲止,我使用了模型內的功能狀態:公共職能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