1

次のように、リレーションと検索を備えたモデルクラス 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 形式でデータが表示されます。

私の目標は、GridView で検索可能な方法でページに表示されるように、関係からの「連絡先ログ」をモデルに結合することです。基本的に、連絡先ログを表示する連絡先ごとに検索可能な GridView 列を追加します。

ご協力いただきありがとうございます。

4

1 に答える 1

1

最初の目標 (モデルで連絡先ログを表示する) では、メイン モデルにゲッターを記述できます。gridview列に何を表示したいかによって異なりますが、次のようなものを使用できます。

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

contactsこれで、「Contactindiv」モデルの通常の属性のように使用できます。

search()2 番目の目標では、フィルター値を含み、メソッドで使用できるパブリック プロパティを追加できます。

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'),
)

私は頭のてっぺんからこれを書いているので、完全にテストできなかったことに注意してください。しかし、うまくいけば、基本的な概念が明確になるはずです。うまくいくかどうか教えてください。

于 2013-03-13T17:22:13.837 に答える