使用Active Record中的关系组合表的Yii模型

时间:2013-03-13 15:22:52

标签: yii

我的模型类Contactindiv有关系和搜索如下。

public function relations()
{
    return array(

    'contactlogs' => array(self::HAS_MANY, 'Contactlog', 'ContactIndivID'),

    );

}

public function search()
{
    $criteria=new CDbCriteria;

    $criteria->compare('ContactIndivID',$this->ContactIndivID);
    $criteria->compare('PersonalTitle',$this->PersonalTitle,true);
    $criteria->compare('NameLast',$this->NameLast,true);
    $criteria->compare('NameMiddle',$this->NameMiddle,true);
    $criteria->compare('NameFirst',$this->NameFirst,true);

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

当前页面以可搜索的CGridView格式显示数据。

我的目标是将关系中的'contactlogs'组合到模型中,以便在GridView中以可搜索的方式显示在页面上。基本上为每个联系人添加一个可搜索的GridView列,显示他们的联系人日志。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

为了您的第一个目标(在模型中显示联系人日志),您可以在主模型中编写一个getter。这取决于您希望在gridview列中显示的内容,但您可以使用以下内容:

public function getContacts()
{
    $names = array();
    foreach($this->contactlogs as $log)
        $names[] = $log->name;
    return implode(', ', $names);
}

现在您可以使用contacts,就好像它是“Contactindiv”模型的常规属性一样。

为了您的第二个目标,您可以添加一个包含过滤器值的公共属性,您可以在search()方法中使用该属性:

public $contactFilter;
public function search()
{
    // ...
    if(!empty($this->contactFilter)) {
        $criteria->with = array(
            'contactlogs' => array(
                'joinType' => 'INNER JOIN',
                'on' => 'contactlogs.name = :name',
             ),
        );
        $criteria->params[':name'] = $this->contactFilter;
    }
    // ..
}

现在您只需要在gridview的columns配置中添加以上所有内容:

array(
    'name' => 'contacts',
    'filter' => CHtml::activeTextField($model, 'contactFilter'),
)

请注意,我从头脑中写下大部分内容并无法完全测试。但它应该有希望让你明确基本概念。如果有效,请告诉我。