2013-03-13 46 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