Search Filtering users by FK in gridview

49 Views Asked by At

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.

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. If you have any suggestions are appreciated. Thank You in advance !

Controller :

<?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' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'delete' => ['POST'],
                ],
            ],
        ];
    }

    /**
     * Lists all UserEquipmentMapping models.
     * @return mixed
     */
    public function actionIndex()
    {
        $usermodel = new UserEquipmentMapping();
        
        $userquery = $usermodel->getUsers();
        
        $displaymodel = new UserEquipmentMapping();
        $displayquery = $displaymodel->getDisplays();
        
        $phonemodel = new UserEquipmentMapping();
        $phonequery = $phonemodel->getPhones();
        
        $laptopmodel = new UserEquipmentMapping();
        $laptopquery = $laptopmodel->getLaptops();
        #foreach($query as $q)
    #       print_r($q);
#       
#       die;
        
        $searchModel = new UserequipmentmappingSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);
                
        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
            'userquery' => $userquery,
            'displayquery' => $displayquery,
            'laptopquery'=> $laptopquery,
            'phonequery'=> $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->render('view', [
            'model' => $this->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()->all();
        $laptopmodel = Laptop::find()->all();
        $phonemodel = Phone::find()->all();
        $displaymodel = Display::find()->all();
        
        #print_r(Yii::$app->request->post()); die;
        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            
            return $this->redirect(['view', 'id' => $model->id]);
        }

        return $this->render('create', [
            'model' => $model,
            'usermodel' => $usermodel,
            'laptopmodel' => $laptopmodel,
            'phonemodel' => $phonemodel,
            'displaymodel' => $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->findModel($id);
        $usermodel = User::find()->all();
        $laptopmodel = Laptop::find()->all();
        $phonemodel = Phone::find()->all();
        $displaymodel = Display::find()->all();
        
        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        }

        return $this->render('update', [
            'model' => $model,
            'usermodel' => $usermodel,
            'laptopmodel' => $laptopmodel,
            'phonemodel' => $phonemodel,
            'displaymodel' => $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->findModel($id)->delete();

        return $this->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.');
    }
}

Model :

<?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 "user_equipment_mapping".
 *
 * @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' => true, 'targetClass' => Display::className(), 'targetAttribute' => ['display_id' => 'id']],
            [['laptop_id'], 'exist', 'skipOnError' => true, 'targetClass' => Laptop::className(), 'targetAttribute' => ['laptop_id' => 'id']],
            [['phone_id'], 'exist', 'skipOnError' => true, 'targetClass' => Phone::className(), 'targetAttribute' => ['phone_id' => 'id']],
            [['user_id'], 'exist', 'skipOnError' => true, 'targetClass' => User::className(), 'targetAttribute' => ['user_id' => 'id']],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'user_id' => 'User ID',
            'laptop_id' => 'Laptop ID',
            'phone_id' => 'Phone ID',
            'display_id' => 'Display ID',
            'start_date' => 'Start Date',
            'stop_date' => 'Stop Date',
        ];
    }

    /**
     * Gets query for [[Display]].
     *
     * @return \yii\db\ActiveQuery|DisplayQuery
     */
    public function getDisplay()
    {
        return $this->hasOne(Display::className(), ['id' => 'display_id']);
    }

    /**
     * Gets query for [[Laptop]].
     *
     * @return \yii\db\ActiveQuery|LaptopQuery
     */
    public function getLaptop()
    {
        return $this->hasOne(Laptop::className(), ['id' => 'laptop_id']);
    }

    /**
     * Gets query for [[Phone]].
     *
     * @return \yii\db\ActiveQuery|PhoneQuery
     */
    public function getPhone()
    {
        return $this->hasOne(Phone::className(), ['id' => 'phone_id']);
    }

    /**
     * Gets query for [[User]].
     *
     * @return \yii\db\ActiveQuery|UserQuery
     */
    public function getUser()
    {
        return $this->hasOne(User::className(), ['id' => 'user_id']);
    }
    
    
    public function getUsers()
    {
        return $this->hasMany(User::className(),['user_id', 'id']);
    }

    public function getLaptops()
    {
        return $this->hasMany(Laptop::className(),['laptop_id', 'id']);
    }
    
    public function getDisplays()
    {
        return $this->hasMany(Display::className(),['dislpay_id', 'id']);
    }
    
    public function getPhones()
    {
        return $this->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());
    }
}

ModelSearch :

<?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' => $query,
        ]);

        $this->load($params);

        if (!$this->validate()) {
            // uncomment the following line if you do not want to return any records when validation fails
            // $query->where('0=1');
            return $dataProvider;
        }

        // grid filtering conditions
        $query->andFilterWhere([
            'id' => $this->id,
            'user_id' => $this->user_id,
            'laptop_id' => $this->laptop_id,
            'phone_id' => $this->phone_id,
            'display_id' => $this->display_id,
            'start_date' => $this->start_date,
            'stop_date' => $this->stop_date,
        ]);

        return $dataProvider;
    }
}

Index :

<?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->title = 'User Equipment Mappings';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="user-equipment-mapping-index">

    <h1><?= Html::encode($this->title) ?></h1>

    <p>
        <?= Html::a('Create User Equipment Mapping', ['create'], ['class' => 'btn btn-success']) ?>
    </p>

    <?php // echo $this->render('_search', ['model' => $searchModel]); ?>

    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'formatter' => [
            'class' => 'yii\i18n\Formatter',
            'nullDisplay' => '-',],
        'columns' => [
            ['class' => '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' => 'yii\grid\ActionColumn'],
        ],
    ]); ?>


</div>
1

There are 1 best solutions below

0
On

Uncomment in your index view _search view. There are all fields from UserequipmentmappingSearch model. You can replace input fields with select fields for user, laptop and etc. Search model will do the other thing, all is in search function that fills your dataprovider