0
votes

**how can i add girdView search to my relation table column ?

i have all girlview search box except my relation table (developersActivity.developer_point) and ('developersActivity.project_done') i have thier value but widget search box not apear above them**

my controller

   $searchModel = new DeveloperSearch();

        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        return $this->render('dashboard', [
            'dataProvider' => $dataProvider,
            'searchModel' => $searchModel
        ]);

my search model

class DeveloperSearch extends Developers
{
    public function rules()
    {
        return parent::rules();
    }

    public function scenarios()
    {
        return Model::scenarios();
    }

    public function search($param)
    {

        $query = Developers::find();

        $dataProvider = new ActiveDataProvider([
            'query' => $query
        ]);

        $this->load($param);

        $query->joinWith('developersActivity');

        $dataProvider->setSort([
            'attributes'=> [
                'name',
                'developersActivity.developer_point'=>[
                    'asc'=>['developer_point'=>SORT_ASC],
                    'desc'=>['developer_point'=>SORT_DESC],
                ]
            ]
        ]);

        $query->andFilterWhere([
            'developer_id' => $this->developer_id,
        ]);

        $query->andFilterWhere(['like', 'name', $this->name])
            ->andFilterWhere(['like', 'phone', $this->phone])
            ->andFilterWhere(['like', 'email', $this->email]);

        return $dataProvider;
    }
}

the model

class Developers extends ActiveRecord
{

    public static function tableName()
    {
        return 'developers';
    }



    public function rules()
    {
        return [
            [['name',
                'family',
                'phone',
                'email',
                'address',
                'brithday',
                'age',
                'ability',
                'role',

                'join_date',
                ], 'required'],
            [['developer_id'], 'integer'],
            ['email','email'],
            [['phone'],'integer', 'min' => 10],
            [['address'], 'string', 'max' => 100],
            [['name'], 'string', 'min' => 3],

        ];
    }



    public  function getDevelopersActivity(){
        return $this->hasOne(DevelopersActivity::className(),['developer_activity_id' => 'developer_id']);
    }

}

and developersActivity model class

class DevelopersActivity extends ActiveRecord
{
    public function rules()
    {
        return [
            [['developer_activity_id',
                'developer_point',
                'project_done',
                'free_rate',
                'address',
                'estimate_for_next_project',
                'date_project_done',
                'number_of_project',
                'activity_rate',
            ], 'safe'],

        ];

    }

}

here is the view

    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,

    'columns' => [
        'developer_id',
        'name',
        'email',
        'phone',
        'email',
        'developersActivity.developer_point',
        'developersActivity.project_done'


        //  'value'=>'developersActivity.point',
        //'contentOptions'=>['style'=>'width: 120px;']
    ],


]);
?>
1

1 Answers

4
votes

in your model add a getter for the field (assuming the field is named actvityname)

/* Getter for deleveloer activity name   */
 public function getDevelopersActivityName() {
   return $this->developersActivity->activityname;
 }

in your searchModel

add a public var for your related field and declare as safe in rules

  /* your calculated attribute */
  public $activityName;

  /* setup rules */
  public function rules() {
     return [
      /* your other rules */
      [['activityName'], 'safe']
     ];
  }

and in the filter you can add the filter for your field

    // filter by developer activity
    $query->joinWith(['developersActivity' => function ($q) {
        $q->where('yor_develeoper_activity_table.your_developer_activity_column LIKE "%' . $this->activityName. '%"');
    }]);

    return $dataProvider;

in gridview you can refer directly using

  'columns' => [
    ['class' => 'yii\grid\SerialColumn'],
    'id',
    'fullName',
    'activityName',
    ['class' => 'yii\grid\ActionColumn'],
]

you can take a look ad this tutorial for some suggestions http://www.yiiframework.com/wiki/621/filter-sort-by-calculated-related-fields-in-gridview-yii-2-0/