【问题标题】:How to get data from two tables for CGridView in YII如何从 YII 中的 CGridView 的两个表中获取数据
【发布时间】:2014-01-23 17:17:42
【问题描述】:

我有以下表格,

CREATE TABLE `m_user`(
    `user_id` INT AUTO_INCREMENT PRIMARY KEY,
    `user_name` VARCHAR(50) NOT NULL,
    `pwd` VARCHAR(50) NOT NULL,
    `type` VARCHAR(25) NOT NULL,
    `actv_sw` VARCHAR(2) NOT NULL,
    `cre8_ts` TIMESTAMP NOT NULL,
    `lst_updt_ts` TIMESTAMP NOT NULL
);

CREATE TABLE `m_expense`(
    `expense_id` INT AUTO_INCREMENT PRIMARY KEY,
    `expense_name` VARCHAR(100) NOT NULL,
    `actv_sw` VARCHAR(2) NOT NULL,
    `added_dt` DATE NOT NULL,
    `cre8_ts` TIMESTAMP NOT NULL,
    `cre8_by` INT NOT NULL,
    `lst_updt_ts` TIMESTAMP,
    `lst_updt_by` INT,
    CONSTRAINT `m_expense_fk1` FOREIGN KEY (`cre8_by`)
        REFERENCES `m_user` (`user_id`),
    CONSTRAINT `m_expense_fk2` FOREIGN KEY (`lst_updt_by`)
        REFERENCES `m_user` (`user_id`)
);

而CGridview的定义如下,

$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'expense-grid',
    'emptyText' => 'No data Found',
    'dataProvider' => Expense::model()->search(),
    'cssFile' => Yii::app()->theme->baseUrl . '/css/gridView.css',
    'enablePagination' => true,
    'enableSorting' => true,
    'pagerCssClass' => 'pager',
    'columns' => array(
        //styling default buttons
        array(
            'header' => 'Update',
            'class' => 'CButtonColumn',
            'template' => '{update}',
            'updateButtonImageUrl' => Yii::app()->theme->baseUrl . '/images/' . 'gr-update.png'
        ),
        array(
            'name' => 'expense_id',
            'header' => 'Id',
            'value' => '$data->expense_id',
            'htmlOptions' => array('style' => 'min-width:20px;')
        ),
        array(
            'name' => 'expense_name',
            'header' => 'Expense Name',
            'value' => '$data->expense_name',
            'htmlOptions' => array('style' => 'min-width:150px;')
        ),
        array(
            'name' => 'added_dt',
            'header' => 'Added Date',
            'value' => '$data->added_dt',
            'htmlOptions' => array('style' => 'min-width:100px;')
        ),
        array(
            'name' => 'actv_sw',
            'header' => 'Active',
            'filter' => array('Y' => 'Yes', 'N' => 'No'),
            'value' => '($data->actv_sw=="Y")?("Yes"):("No")',
            'htmlOptions' => array('style' => 'min-width:50px;')
        ),
        array(
            'name' => 'cre8_ts',
            'header' => 'Created Time',
            'value' => '$data->cre8_ts',
            'htmlOptions' => array('style' => 'min-width:100px;')
        ),
        array(
            'name' => 'cre8_by',
            'header' => 'Created By',
            'value' => '$data->user_name',
            'htmlOptions' => array('style' => 'min-width:50px;')
        ),
        array(
            'name' => 'lst_updt_ts',
            'header' => 'Updated Time',
            'value' => '$data->lst_updt_ts',
            'htmlOptions' => array('style' => 'min-width:100px;')
        ),
        array(
            'name' => 'lst_updt_by',
            'header' => 'Updated By',
            'value' => '$data->user_name',
            'htmlOptions' => array('style' => 'min-width:50px;')
        )
    )
        )
);

模型定义如下,

class Expense extends CActiveRecord {

    /**
     * @return string the associated database table name
     */
    public function tableName() {
        return 'm_expense';
    }

    /**
     * @return array validation rules for model attributes.
     */
    public function rules() {
        return array(
            array('expense_name, actv_sw, added_dt, cre8_ts, cre8_by', 'required'),
            array('cre8_by, lst_updt_by', 'numerical', 'integerOnly' => true),
            array('expense_name', 'length', 'max' => 100),
            array('actv_sw', 'length', 'max' => 2),
            array('lst_updt_ts', 'safe'),
            array('expense_id, expense_name, actv_sw, added_dt, cre8_ts, cre8_by, lst_updt_ts, lst_updt_by', 'safe', 'on' => 'search')
        );
    }

    /**
     * @return array relational rules.
     */
    public function relations() {
        return array(
            'cre8By' => array(self::BELONGS_TO, 'MUser', 'cre8_by'),
            'lstUpdtBy' => array(self::BELONGS_TO, 'MUser', 'lst_updt_by'),
            'tExpensesPayments' => array(self::HAS_MANY, 'TExpensesPayment', 'expense_id'),
        );
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels() {
        return array(
            'expense_id' => 'Expense',
            'expense_name' => 'Expense Name',
            'actv_sw' => 'Active Status',
            'added_dt' => 'Added Date',
            'cre8_ts' => 'Cre8 Ts',
            'cre8_by' => 'Cre8 By',
            'lst_updt_ts' => 'Lst Updt Ts',
            'lst_updt_by' => 'Lst Updt By',
        );
    }

    /**
     * Retrieves a list of models based on the current search/filter conditions.
     *
     * @return CActiveDataProvider the data provider that can return the models
     * based on the search/filter conditions.
     */
    public function search() {
        $criteria = new CDbCriteria;

        /* $criteria->compare('expense_id', $this->expense_id);
          $criteria->compare('expense_name', $this->expense_name, true);
          $criteria->compare('actv_sw', $this->actv_sw, true);
          $criteria->compare('added_dt', $this->added_dt, true);
          $criteria->compare('cre8_ts', $this->cre8_ts, true);
          $criteria->compare('cre8_by', $this->cre8_by);
          $criteria->compare('lst_updt_ts', $this->lst_updt_ts, true);
          $criteria->compare('lst_updt_by', $this->lst_updt_by); */

        return new CActiveDataProvider('Expense', array(
            'criteria' => array(
                'with' => array('cre8By' => array('joinType' => 'LEFT JOIN'))
            )
        ));
    }

    /**
     * Returns the static model of the specified AR class.
     * Please note that you should have this exact method in all your CActiveRecord descendants!
     * @param string $className active record class name.
     * @return Expense the static model class
     */
    public static function model($className = __CLASS__) {
        return parent::model($className);
    }

}

实际上我想在 CGridView 中显示用户名而不是 cre8_by 和 lst_updt_by 列,帮我解决这个问题。在此先感谢........

【问题讨论】:

    标签: php yii


    【解决方案1】:

    替换 'value' => '$data->cre8_by',by

    'value' => '$data->cre8By->user_name',
    

    然后

    'value' => '$data->user_name',替换为

    'value' => '$data->lstUpdtBy->user_name',
    

    您必须在搜索中添加另一个关系:

    return new CActiveDataProvider('Expense', array(
                'criteria' => array(
                        'with' => array('cre8By' => array('joinType' => 'LEFT JOIN'),
                                        'lstUpdtBy' => array('joinType' => 'LEFT JOIN')
                                       ),
                         'together'  => true
                )
            ));
    

    【讨论】:

    • 我不想更改 cre8_ts。我需要在 cre8_by 和 lst_updt_by 列中显示用户名。
    • Getting as 'include(MUser.php): failed to open stream: No such file or directory [error] [php] include(MUser.php): failed to open stream: No such file or目录 (C:\xampp\htdocs\yii-1.1.14.f0fee9\framework\YiiBase.php:427)'
    • 你有名为 MUser.php 的模型吗?
    • NO... 模型名称为 User.php
    • 那么你必须将关系更新为'cre8By' => array(self::BELONGS_TO, 'User', 'cre8_by'),你也必须为下一个关系做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    相关资源
    最近更新 更多