简体   繁体   中英

Yii2 Use two Models in one GridView

I have a GridView which displays an employee's summary of his/her payslip. Here's a screenshot for more understanding:

在此处输入图片说明

Those highlighted columns come from a different model which is the User model while the rest come from the Payslip model.

How do I merge 2 models in one GridView ? Because in GridView , it is more likely for you to have a single model to display data. But how about 2 models?

Here's a code in my Payslip model , note that getUser() is generated with gii since user_id is a foreign key in my payslip table:

public function getUser()
{
    return $this->hasOne(User::className(), ['user_id' => 'user_id']);
}

public function getFirstName()
{
    return $this->user ? $this->user->fname : 'First Name';
}

public function getLastName()
{
    return $this->user ? $this->user->lname : 'Last Name';
}

The Payslip controller :

public function actionIndex()
{
    $searchModel = new PayslipSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

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

And then the Payslip view :

<?php   
    echo GridView::widget([
        'dataProvider' => $dataProvider,
        //'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],

            'payslip_id',
            //'store_id',
            'firstName',
            'lastName',
            'total_earnings',
            'total_deduction',
            'net_pay',

            ['class' => 'yii\grid\ActionColumn'],
        ],
    ]); 
?>

BTW, in this example, I just created payslip #1 manually to give you a demo.

Additional info: The logged in user is a BizAdmin user, and all of BizAdmin's staff users should be displayed in the payslip table (that table above) even if these staff users still don't have any payslip created for them. So by default, that table will be occupied already with staff users under the logged in BizAdmin user, and those staff users who still have no payslips created will be indicated "Create Payslip"

Here's an example in KashFlow: 在此处输入图片说明

Update view to:

<?php   
    echo GridView::widget([
        'dataProvider' => $dataProvider,
        //'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],

            'payslip_id',
            //'store_id',
            ['value' => function ($data) {return $data->getFirstName();}, 'label' => 'First Name'],
            ['value' => function ($data) {return $data->getLastName();}, 'label' => 'LastName'],

            'total_earnings',
            'total_deduction',
            'net_pay',

            ['class' => 'yii\grid\ActionColumn'],
        ],
    ]); 
?>

And in $searchModel->search add you relation, like that:

 $query = Payslip::find()->with(['user']);

Read for data column - http://www.yiiframework.com/doc-2.0/guide-output-data-widgets.html#data-column

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM