Tengo las siguientes relaciones en el modelo yii2:

    public function getJobInfos()
    {
        return $this->hasMany(JobInfo::className(), ['ID' => 'ID']);
    }

Tbl JobInfo:

CREATE TABLE [dbo].[JobInfo](
    [ID] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
    [Parameter] [int] NULL,
    [Value] [varchar](255) NULL,
....

El acceso a JobInfo en GridView funciona :

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

            'ID',
            [
                'label' => 'Strings',
                'value' => function ($data) {
                    $strings = [];

                    foreach($data->jobInfos as $JobInfo) {

                        $strings[] = $JobInfo->Value;

                    }

                    return implode(',', $strings);

                },

            ],


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

Ahora todo el contenido de JobInfo se carga en la columna de cadenas.

Ahora, ¿cómo puedo seleccionar una nueva columna para un conjunto: $ JobInfo-> Parameter (Label) y $ JobInfo-> Value (Value)? Por ejemplo, si el parámetro es "OrderNo"?

Desafortunadamente, crear columnas con Foreach no funciona.

¡Thx!

0
JohnWorks 13 may. 2020 a las 12:58

3 respuestas

$data->jobInfos devuelve una matriz de objetos Tbl_JobInfo

'value' => function($data) {
    return implode(\yii\helpers\ArrayHelper::map($data->jobInfos, 'Parameter', 'Value')),
},
0
user206 13 may. 2020 a las 22:53

Esta función ahora devuelve el valor en una columna. Pero si creo muchas columnas, quiero construir la matriz solo una vez.

            [
                'label' => 'column_name1',

                'value' => function($model) {
                    $datareturn = $model-> jobInfos()
                        ->where(['=', 'Parameter', 'column_name1'])
                        ->one();

                    return  $datareturn['Value'];
                    },

            ],

¿Construir una matriz con todos los parámetros en el modelo y pasarla a la vista en el controlador?

0
JohnWorks 15 may. 2020 a las 10:40

Usa algo como:

Index.php

[
'class' => 'kartik\grid\ExpandRowColumn',
'width' => '300px',
'value' => function ($model, $key, $index, $column) {
    return GridView::ROW_COLLAPSED;
},
'detail' => function ($model, $key, $index, $column) {
    return Yii::$app->controller->renderPartial('_expandableview', ['model' => 
$model]);
},
'disabled'=> function ($model, $key, $index, $column) {
                $rows  = $model->jobInfos;
                if (!empty($rows)) { return false;} else { return true;}
},    
'headerOptions' => ['class' => 'kartik-sheet-style'], 
'expandOneOnly' => true,
],

Vista expandible:

<div class="Info-expandable-view">
<table border="0" class="table transparent">
<?php
$rows = $model->jobInfos;
foreach ($rows as $key => $value) {

//split your columns here using
//$myParameter = $value['Parameter'];
//$myValue = $value['Value'];
}
0
Addi 15 may. 2020 a las 17:22