从另一个模型自定义变量过滤

时间:2014-10-23 02:28:44

标签: yii

所以基本上我有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',

2 个答案:

答案 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);