yii显示来自其他表的cgridview数据

时间:2014-05-03 12:57:13

标签: yii foreign-keys cgridview

我在使用外键在cgridview上显示数据时遇到问题。 这是我的情况,我有表employee(id,username),client(id,username)和transaction(id,employeeId,clientId)。 employeeId是employee.id的外键,clientId是client.id的外键。现在,我想在事务admin.php上显示员工的姓名和客户名称,而不是他们的ID。 这是我的代码:

class Transaction extends CActiveRecord
{
    public $client_search;
    public $employee_search;

public function rules()
{
    return array(
        .
        .
        .
        array('id, employeeId, clientId, balance, status, date, client_search, employee_search', 'safe', 'on'=>'search'),
    );
}

public function relations()
{
    return array(
        'employee' => array(self::BELONGS_TO, 'Employee', 'employeeId'),
        'client' => array(self::BELONGS_TO, 'Client', 'clientId'),
    );
}

public function search()
{
    $criteria=new CDbCriteria;
    $criteria->with = array( 'client', 'employee' );

    $criteria->together = true;
    $criteria->compare('t.id',$this->id,true);
    $criteria->compare('employee.username', $this->employee_search, true );
    $criteria->compare('client.username', $this->client_search, true );
    $criteria->compare('t.balance',$this->balance,true);
    $criteria->compare('t.status',$this->status);
    $criteria->compare('t.date',$this->date,true);

    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
    ));
}

 //the other functions are there, i don't edit it.
}

这是我的模型/ Transaction.php

<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'transaction-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
    'id',
    array(
        'header' => 'Employee',
        'name' => 'employee_search',
        'value' => '$data->employee->username',
    ),
    array(
        'header' => 'Client',
        'name' => 'client_search',
        'value' => '$data->client->username',
    ),
    array(
        'class'=>'CButtonColumn',
    ),
),
)); 

这是我的观点/ transaction / admin.php。 并且此代码给了我错误尝试获取非对象的属性($ data-&gt; employee-&gt; id标记)。 实际上我已经成功地显示了员工的姓名而不是员工的ID,但之后我对客户端使用了相同的方法,并出现错误。 有人可以帮帮我吗?我的方法是公开employee_search,添加规则,添加关系,添加$ creiteria-&gt;,然后更改admin.php。有人请帮帮我。

// UPDATE 解决了。它实际上是我的错。数据库中有关于关系(外键)的错误。我的编码很好。

1 个答案:

答案 0 :(得分:0)

如果不能调试代码,很难猜到,但这里有一些可能有用的东西(我会想到它们会增加更多内容)。

可能是因为关系的默认joinType都是LEFT OUTER JOIN,而且你可能有一个Transaction,其中一个是空的?如果您尝试访问null对象上的属性(而不是实际的ActiveRecord对象),那就是您将看到的错误消息。

您可以通过执行以下操作进行更改:

public function relations()
{
    return array(
        'employee' => array(self::BELONGS_TO, 'Employee', 'employeeId',array('joinType'=>'INNER JOIN')),
        'client' => array(self::BELONGS_TO, 'Client', 'clientId',array('joinType'=>'INNER JOIN')),
    );
}

P.S。: INNER JOINJOIN

相同

不确定它是否会对您有所帮助,但值得尝试。

有关详情,请访问:http://www.yiiframework.com/doc/api/1.1/CActiveRecord#relations-detail