douzhi1919 2012-07-26 04:15
浏览 25
已采纳

yii如何在另一个模型的BootDetailView中显示数据

Q: How can I show the BootDetailView like this.

Users

name : aa
company : test
department : dep1
section : sec1.1
team : team1.1.1

I've 2 tbls (department and user)

This is the department tbl structure

department
id | name      | p_id | company_id
1  | dep1      | 0    | 1
2  | dep2      | 0    | 1
3  | sec1.1    | 1    | 1
4  | sec2.1    | 2    | 1
5  | team1.1.1 | 3    | 1
6  | team1.1.2 | 3    | 1
7  | team2.1.1 | 4    | 1

this is the user tbl structure

user
id | name | company_id | team_id
1  | aa   | 1          | 5
2  | bb   | 1          | 5
3  | cc   | 1          | 7
4  | dd   | 1          | 6
5  | ee   | 1          | 6

I added relationship at user model

public function relations()
    {
        // NOTE: you may need to adjust the relation name and the related
        // class name for the relations automatically generated below.
        return array(
            'ranks' => array(self::BELONGS_TO, 'Rank', 'rank_id'),
            'companies' => array(self::BELONGS_TO, 'Company', 'company_id'),
            'departments' => array(self::BELONGS_TO, 'Department', 'team_id'),
        );
    }

this view (CGridView is using at index.php (view))

<?php $this->widget('bootstrap.widgets.BootDetailView', array(
            'data'=>$model,
            'attributes'=>array(
                //array('name'=>'id', 'label'=>'ID'),
                array('name'=>'login_name', 'label'=>'Name'),
                array('name'=>'first_name', 'label'=>'First Name'),
                array('name'=>'last_name', 'label'=>'last Name'),
                array('name'=>'email', 'label'=>'Email'),
                array('name'=>'created', 'label'=>'Created'),
                array('name'=>'ranks.name', 'label'=>'Rank'),
                array('name'=>'companies.name', 'label'=>'Company'),
                array('name'=>'departments.name', 'label'=>'Team'),
            ),
        )); ?>

This is Controller

public function actionView($id)
{
    $model = $this->loadModel($id);
    $sql = 'SELECT id, name FROM rank r WHERE r.id = '. $model->rank_id;
    $rank = Yii::app()->db->createCommand($sql)->queryAll();

    $sql = 'SELECT id, name FROM company c WHERE c.id = '. $model->company_id;
    $company = Yii::app()->db->createCommand($sql)->queryAll();         

    $dst = $this->getDST($model->team_id);

    $this->render('view',array(
        'model'=>$model,
        'rank'=>$rank[0]['name'],
        'company'=>$company[0]['name'],
        'department'=>$dst['department'],
        'section'=>$dst['section'],
        'team'=>$dst['team'],
    ));
}

public function getDST($team_id) // Getting the Department, Section and Team
{
    $records = Department::model()->find('id=:id', array(':id'=>$team_id));
    if($records->p_id == 0 ) {
    $dst['department'] = $model->team_id;
        $dst['section'] = NULL;
        $dst['team'] = NULL;
    } else {
        $records = Department::model()->find('id=:id', array(':id'=>$records->p_id));
        if($records->p_id == 0 ) {
            $dst['department'] = $records->id;
            $dst['section'] = $model->team_id;
            $dst['team'] = NULL;
        } else {
            $dst['section'] = $records->id;
            $dst['team'] = NULL;
            $records = Department::model()->find('id=:id', array(':id'=>$records->p_id));
            if($records->p_id == 0 ) {
                $dst['department'] = $records->id;
                $dst['team'] = $model->team_id;
            }
        }
    }   
    return $dst;
} 
  • 写回答

1条回答 默认 最新

  • dongyan5815 2012-07-26 05:20
    关注

    In Yii relation is simple:

    // User model
    public function relations()
    {
        return array(
            'rank' => array(self::BELONGS_TO, 'Rank', 'rank_id'),
            'company' => array(self::BELONGS_TO, 'Company', 'company_id'),
            'department' => array(self::BELONGS_TO, 'Department', 'team_id'),
        );
    } // User have only one rank, company and department
    
    // Department model
    public function relations()
    {
        return array(
            'parent'   => array(self::BELONGS_TO, 'Department', 'p_id'),
            'children' => array(self::HAS_MANY, 'Department', 'p_id'),
            'company'  => array(self::BELONGS_TO, 'Company', 'company_id'),
            'users'    => array(self::HAS_MANY, 'User', 'team_id'),
        );
    } 
    

    Because : class BootDetailView extends CDetailView
    It is enough:

    // usercontroller
    function actionView($id)
    {
        $this->render('view', array('model' => $this->loadModel($id));
        // or for optimize sql query
        $this->render('view', array('model' => User::model()->with(array('rank', 'company', 'department'))->findByPk($id));
    }
    
    // view.php
    $details = array(
             'login_name',
             'first_name',
             'last_name',
             'email',
             'rank.name',
             'company.name',
         );
    $departments = array();
    $d = $model->department;
    $departments[] = 'department.name';
    $s = 'parent.';
    while ($d->parent != null) {
        $departments[] = 'department.'.$s.'name';
        $s .= 'parent.';
        $d = $d->parent;
    }
    
    $this->widget('bootstrap.widgets.BootDetailView', array(
        'data'=>$model,
        'attributes'=> array_merge($details, $departments),
    )); 
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题