title: Search Filtering users by FK in gridview
body: <p>I have users table containing : PK - id, username, password.
  i have three tables ( laptop, display, phone) - id - FK, series, model
  I have userequipmentmapping table containing : id - PK , user_id - FK( id from users table), laptop_id - FK (id from laptop table), phone_id - FK (id from phone table), display_id(id from dislpay table), start_date, end_date.</p>
  <p>I want to search by user in my gridview from UserEquipmentMapping, but don't know where should i implement the search model, considering the username is passed from the users table by foreign key.
  <strong>If you have any suggestions are appreciated. Thank You in advance !</strong></p>
  <p>Controller :</p>
  <pre><code>&lt;?php
  
  namespace app\controllers;
  
  use Yii;
  use app\models\UserEquipmentMapping;
  use app\models\UserequipmentmappingSearch;
  use yii\web\Controller;
  use yii\web\NotFoundHttpException;
  use yii\filters\VerbFilter;
  use app\models\User;
  use app\models\Laptop;
  use app\models\Phone;
  use app\models\Display;
  /**
   * UserequipmentmappingController implements the CRUD actions for UserEquipmentMapping model.
   */
  class UserequipmentmappingController extends Controller
  {
      /**
       * {@inheritdoc}
       */
      public function behaviors()
      {
          return [
              'verbs' =&gt; [
                  'class' =&gt; VerbFilter::className(),
                  'actions' =&gt; [
                      'delete' =&gt; ['POST'],
                  ],
              ],
          ];
      }
  
      /**
       * Lists all UserEquipmentMapping models.
       * @return mixed
       */
      public function actionIndex()
      {
          $usermodel = new UserEquipmentMapping();
          
          $userquery = $usermodel-&gt;getUsers();
          
          $displaymodel = new UserEquipmentMapping();
          $displayquery = $displaymodel-&gt;getDisplays();
          
          $phonemodel = new UserEquipmentMapping();
          $phonequery = $phonemodel-&gt;getPhones();
          
          $laptopmodel = new UserEquipmentMapping();
          $laptopquery = $laptopmodel-&gt;getLaptops();
          #foreach($query as $q)
      #       print_r($q);
  #       
  #       die;
          
          $searchModel = new UserequipmentmappingSearch();
          $dataProvider = $searchModel-&gt;search(Yii::$app-&gt;request-&gt;queryParams);
                  
          return $this-&gt;render('index', [
              'searchModel' =&gt; $searchModel,
              'dataProvider' =&gt; $dataProvider,
              'userquery' =&gt; $userquery,
              'displayquery' =&gt; $displayquery,
              'laptopquery'=&gt; $laptopquery,
              'phonequery'=&gt; $phonequery,
          ]);
      }
  
      /**
       * Displays a single UserEquipmentMapping model.
       * @param integer $id
       * @return mixed
       * @throws NotFoundHttpException if the model cannot be found
       */
      public function actionView($id)
      {
          return $this-&gt;render('view', [
              'model' =&gt; $this-&gt;findModel($id),
          ]);
      }
  
      /**
       * Creates a new UserEquipmentMapping model.
       * If creation is successful, the browser will be redirected to the 'view' page.
       * @return mixed
       */
      public function actionCreate()
      {
          $model = new UserEquipmentMapping();
          
          $usermodel = User::find()-&gt;all();
          $laptopmodel = Laptop::find()-&gt;all();
          $phonemodel = Phone::find()-&gt;all();
          $displaymodel = Display::find()-&gt;all();
          
          #print_r(Yii::$app-&gt;request-&gt;post()); die;
          if ($model-&gt;load(Yii::$app-&gt;request-&gt;post()) &amp;&amp; $model-&gt;save()) {
              
              return $this-&gt;redirect(['view', 'id' =&gt; $model-&gt;id]);
          }
  
          return $this-&gt;render('create', [
              'model' =&gt; $model,
              'usermodel' =&gt; $usermodel,
              'laptopmodel' =&gt; $laptopmodel,
              'phonemodel' =&gt; $phonemodel,
              'displaymodel' =&gt; $displaymodel,
          ]);
      }
  
      /**
       * Updates an existing UserEquipmentMapping model.
       * If update is successful, the browser will be redirected to the 'view' page.
       * @param integer $id
       * @return mixed
       * @throws NotFoundHttpException if the model cannot be found
       */
      public function actionUpdate($id)
      {
          $model = $this-&gt;findModel($id);
          $usermodel = User::find()-&gt;all();
          $laptopmodel = Laptop::find()-&gt;all();
          $phonemodel = Phone::find()-&gt;all();
          $displaymodel = Display::find()-&gt;all();
          
          if ($model-&gt;load(Yii::$app-&gt;request-&gt;post()) &amp;&amp; $model-&gt;save()) {
              return $this-&gt;redirect(['view', 'id' =&gt; $model-&gt;id]);
          }
  
          return $this-&gt;render('update', [
              'model' =&gt; $model,
              'usermodel' =&gt; $usermodel,
              'laptopmodel' =&gt; $laptopmodel,
              'phonemodel' =&gt; $phonemodel,
              'displaymodel' =&gt; $displaymodel,
          ]);
      }
  
      /**
       * Deletes an existing UserEquipmentMapping model.
       * If deletion is successful, the browser will be redirected to the 'index' page.
       * @param integer $id
       * @return mixed
       * @throws NotFoundHttpException if the model cannot be found
       */
      public function actionDelete($id)
      {
          $this-&gt;findModel($id)-&gt;delete();
  
          return $this-&gt;redirect(['index']);
      }
  
      /**
       * Finds the UserEquipmentMapping model based on its primary key value.
       * If the model is not found, a 404 HTTP exception will be thrown.
       * @param integer $id
       * @return UserEquipmentMapping the loaded model
       * @throws NotFoundHttpException if the model cannot be found
       */
      protected function findModel($id)
      {
          if (($model = UserEquipmentMapping::findOne($id)) !== null) {
              return $model;
          }
  
          throw new NotFoundHttpException('The requested page does not exist.');
      }
  }
  </code></pre>
  <p>Model :</p>
  <pre><code>&lt;?php
  
  namespace app\models;
  
  use Yii;
  use app\models\User;
  use app\models\UserQuery;
  use yii\db\ActiveQuery;
  /**
   * This is the model class for table &quot;user_equipment_mapping&quot;.
   *
   * @property int $id
   * @property int $user_id
   * @property int|null $laptop_id
   * @property int|null $phone_id
   * @property int|null $display_id
   * @property string|null $start_date
   * @property string|null $stop_date
   *
   * @property Display $display
   * @property Laptop $laptop
   * @property Phone $phone
   * @property User $user
   */
  class UserEquipmentMapping extends \yii\db\ActiveRecord
  {
      /**
       * {@inheritdoc}
       */
      public static function tableName()
      {
          return 'user_equipment_mapping';
      }
  
      /**
       * {@inheritdoc}
       */
      public function rules()
      {
          return [
              [['user_id'], 'required'],
              [['user_id', 'laptop_id', 'phone_id', 'display_id'], 'integer'],
              [['start_date', 'stop_date'], 'safe'],
              [['display_id'], 'exist', 'skipOnError' =&gt; true, 'targetClass' =&gt; Display::className(), 'targetAttribute' =&gt; ['display_id' =&gt; 'id']],
              [['laptop_id'], 'exist', 'skipOnError' =&gt; true, 'targetClass' =&gt; Laptop::className(), 'targetAttribute' =&gt; ['laptop_id' =&gt; 'id']],
              [['phone_id'], 'exist', 'skipOnError' =&gt; true, 'targetClass' =&gt; Phone::className(), 'targetAttribute' =&gt; ['phone_id' =&gt; 'id']],
              [['user_id'], 'exist', 'skipOnError' =&gt; true, 'targetClass' =&gt; User::className(), 'targetAttribute' =&gt; ['user_id' =&gt; 'id']],
          ];
      }
  
      /**
       * {@inheritdoc}
       */
      public function attributeLabels()
      {
          return [
              'id' =&gt; 'ID',
              'user_id' =&gt; 'User ID',
              'laptop_id' =&gt; 'Laptop ID',
              'phone_id' =&gt; 'Phone ID',
              'display_id' =&gt; 'Display ID',
              'start_date' =&gt; 'Start Date',
              'stop_date' =&gt; 'Stop Date',
          ];
      }
  
      /**
       * Gets query for [[Display]].
       *
       * @return \yii\db\ActiveQuery|DisplayQuery
       */
      public function getDisplay()
      {
          return $this-&gt;hasOne(Display::className(), ['id' =&gt; 'display_id']);
      }
  
      /**
       * Gets query for [[Laptop]].
       *
       * @return \yii\db\ActiveQuery|LaptopQuery
       */
      public function getLaptop()
      {
          return $this-&gt;hasOne(Laptop::className(), ['id' =&gt; 'laptop_id']);
      }
  
      /**
       * Gets query for [[Phone]].
       *
       * @return \yii\db\ActiveQuery|PhoneQuery
       */
      public function getPhone()
      {
          return $this-&gt;hasOne(Phone::className(), ['id' =&gt; 'phone_id']);
      }
  
      /**
       * Gets query for [[User]].
       *
       * @return \yii\db\ActiveQuery|UserQuery
       */
      public function getUser()
      {
          return $this-&gt;hasOne(User::className(), ['id' =&gt; 'user_id']);
      }
      
      
      public function getUsers()
      {
          return $this-&gt;hasMany(User::className(),['user_id', 'id']);
      }
  
      public function getLaptops()
      {
          return $this-&gt;hasMany(Laptop::className(),['laptop_id', 'id']);
      }
      
      public function getDisplays()
      {
          return $this-&gt;hasMany(Display::className(),['dislpay_id', 'id']);
      }
      
      public function getPhones()
      {
          return $this-&gt;hasMany(Phone::className(),['phone_id', 'id']);
      }
      
      
      /**
       * {@inheritdoc}
       * @return UserEquipmentMappingQuery the active query used by this AR class.
       */
      public static function find()
      {
          return new UserEquipmentMappingQuery(get_called_class());
      }
  }
  </code></pre>
  <p>ModelSearch :</p>
  <pre><code>&lt;?php
  
  namespace app\models;
  
  use yii\base\Model;
  use yii\data\ActiveDataProvider;
  use app\models\UserEquipmentMapping;
  
  /**
   * UserequipmentmappingSearch represents the model behind the search form of `app\models\UserEquipmentMapping`.
   */
  class UserequipmentmappingSearch extends UserEquipmentMapping
  {
      /**
       * {@inheritdoc}
       */
      public function rules()
      {
          return [
              [['id', 'user_id', 'laptop_id', 'phone_id', 'display_id'], 'integer'],
              [['start_date', 'stop_date'], 'safe'],
          ];
      }
  
      /**
       * {@inheritdoc}
       */
      public function scenarios()
      {
          // bypass scenarios() implementation in the parent class
          return Model::scenarios();
      }
  
      /**
       * Creates data provider instance with search query applied
       *
       * @param array $params
       *
       * @return ActiveDataProvider
       */
      public function search($params)
      {
          $query = UserEquipmentMapping::find();
  
          // add conditions that should always apply here
  
          $dataProvider = new ActiveDataProvider([
              'query' =&gt; $query,
          ]);
  
          $this-&gt;load($params);
  
          if (!$this-&gt;validate()) {
              // uncomment the following line if you do not want to return any records when validation fails
              // $query-&gt;where('0=1');
              return $dataProvider;
          }
  
          // grid filtering conditions
          $query-&gt;andFilterWhere([
              'id' =&gt; $this-&gt;id,
              'user_id' =&gt; $this-&gt;user_id,
              'laptop_id' =&gt; $this-&gt;laptop_id,
              'phone_id' =&gt; $this-&gt;phone_id,
              'display_id' =&gt; $this-&gt;display_id,
              'start_date' =&gt; $this-&gt;start_date,
              'stop_date' =&gt; $this-&gt;stop_date,
          ]);
  
          return $dataProvider;
      }
  }
  </code></pre>
  <p>Index :</p>
  <pre><code>&lt;?php
  
  use yii\helpers\Html;
  use yii\grid\GridView;
  
  /* @var $this yii\web\View */
  /* @var $searchModel app\models\UserequipmentmappingSearch */
  /* @var $dataProvider yii\data\ActiveDataProvider */
  
  $this-&gt;title = 'User Equipment Mappings';
  $this-&gt;params['breadcrumbs'][] = $this-&gt;title;
  ?&gt;
  &lt;div class=&quot;user-equipment-mapping-index&quot;&gt;
  
      &lt;h1&gt;&lt;?= Html::encode($this-&gt;title) ?&gt;&lt;/h1&gt;
  
      &lt;p&gt;
          &lt;?= Html::a('Create User Equipment Mapping', ['create'], ['class' =&gt; 'btn btn-success']) ?&gt;
      &lt;/p&gt;
  
      &lt;?php // echo $this-&gt;render('_search', ['model' =&gt; $searchModel]); ?&gt;
  
      &lt;?= GridView::widget([
          'dataProvider' =&gt; $dataProvider,
          'filterModel' =&gt; $searchModel,
          'formatter' =&gt; [
              'class' =&gt; 'yii\i18n\Formatter',
              'nullDisplay' =&gt; '-',],
          'columns' =&gt; [
              ['class' =&gt; 'yii\grid\SerialColumn'],
              #'id',
              'user.username',
              #'laptop.laptop_model',
              'laptop.laptop_series',
              #'laptop_id',
              #'phone.phone_model',
              'phone.phone_series',
              #'phone_id',
              #'display.display_model',
              'display.display_series',
              #'display_id',
              'start_date',
              'stop_date',
  
              ['class' =&gt; 'yii\grid\ActionColumn'],
          ],
      ]); ?&gt;
  
  
  &lt;/div&gt;
  </code></pre>