所以基本上我有3个模型,即Credits,Employee和User。
Credits通过employee_id列属于Employee模型,Employee通过user_id属于User模型。
在Employee模型中,我添加了一个自定义变量$ fullName,它从User表中检索员工的姓名。
private $_fullName = null;
public function getFullName()
{
if ($this->_fullName === null && $this->usr !== null) {
$this->_fullName = $this->usr->last_name . ', ' . $this->usr->first_name. ' ' . $this->usr->middle_name;
}
return $this->_fullName;
}
public function setFullName($value)
{
$this->_fullName = $value;
}
public function relations()
{
return array(
'usr'=>array(self::BELONGS_TO, 'User', 'employee_id'),
);
}
现在在Credits模型中,我重用了相同的变量$ fullName并将其值发送到employee.fullName,以便我可以访问credits.fullName并在cgridview中使用它。我的问题是它在cgrid上正常工作,但我不知道如何使用该自定义变量过滤数据。我需要知道我可以用什么来比较来自信用的$ this-> fullName来在搜索功能中进行过滤。我能想到的一个解决方案是直接将Credits表与User表相关联,但我想知道是否可以在Employee模型上使用自定义变量。
学分模型:
public function getFullName()
{
if ($this->_fullName === null && $this->employee !== null) {
$this->_fullName = $this->employee->fullName;
}
return $this->_fullName;
}
public function setFullName($value)
{
$this->_fullName = $value;
}
public function relations()
{
return array(
'employee' => array(self::BELONGS_TO, 'Employee', 'employee_id'),
);
}
public function search()
{
// Warning: Please modify the following code to remove attributes that
// should not be searched.
$criteria=new CDbCriteria;
$criteria->with ='employee';
???????????? what to add here
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
));
}
Cgridview:
$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'credits-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'fullName',
答案 0 :(得分:0)
添加比较方法
$criteria->compare('employee.fullName', $this->fullName, true);
答案 1 :(得分:0)
你必须在with方法中包含实体用户并在compare concat中包含字段名称,在mysql中就像
$criteria->with = array('employee' => array('with' => 'user'));
$criteria->compare('concat(user.firstname, \' \', user.lastname)', $this->fullName, true);