我在使用外键在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 解决了。它实际上是我的错。数据库中有关于关系(外键)的错误。我的编码很好。
答案 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 JOIN
与JOIN
不确定它是否会对您有所帮助,但值得尝试。
有关详情,请访问:http://www.yiiframework.com/doc/api/1.1/CActiveRecord#relations-detail