2013-03-13 75 views
1

我有模型类Contactindiv与关系和搜索如下。Yii模型与组合表使用关系在活动记录

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格式显示数据。

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

非常感谢您的帮助!

回答

1

为了您的第一个目标(在模型中显示接触日志),您可以在主模型中编写一个吸气器。这取决于你想在你的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'), 
) 

请注意,我正在写这个最从我的头顶,不能完全测试。但它应该有希望使你的基本概念清晰。请让我知道它是否有效。

+0

谢谢迈克尔,我会放手让你知道。 – DaveyLaser 2013-03-13 17:26:31

+0

仍在努力。这无疑帮助我朝着正确的方向前进。再次感谢。 – DaveyLaser 2013-03-14 03:51:13