1

如图所示,我的数据库中有四个表(用户、用户测试、测试、状态)。用户和测试之间存在 M:M 关系,因此 user_test 是它们之间的动名词。status 表包含 user_test 和 test 表的状态。状态表中的表名字段显示状态属于哪个表,如下图所示。

我想在 CGridView 中显示表 user_test 以及所有三个表 user、test 和 status 中的相关数据。一切都很好,关系正确。

问题:当我想在我的 CGrid 中显示 status.name 时:

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

它给了我名字“完成”,但它是表“测试”的状态,正确的应该是“确认”,因为 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'
                ),
                '*',
            ),
        ),
    ));
}

更新:关系在这里:

//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)
4

2 回答 2

0

在比较部分之前添加

$criteria->addCondition('Where a = b'); 

http://www.yiiframework.com/doc/api/1.1/CDbCriteria#addCondition-detail

它需要和或或类似的重载

 $criteria->addCondition('Where a = b', AND); 
于 2013-07-12T20:42:20.330 回答
0
$criteria=new CDbCriteria;
$criteria->condition="user_name='john' and user_status='active'";
于 2013-07-15T09:29:34.297 回答