Yii2:GridView,为什么有些数据键返回id而其他返回对象?

时间:2015-12-24 08:55:55

标签: gridview yii

我一直在制作一个代码,它可以使用CheckboxColumn类获取每个列行的数据值。所有这些都将对象模型作为值返回,但我刚刚添加的网格之一是返回id模型而不是像其他人一样返回对象。

代码是这样的:

<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'tableOptions'=>[
        'class'=>'table table-striped table-bordered table-hover',
        'data'=>[
            'selector'=>'parametros'
        ]
    ],
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],

        'liminf',
        'limsup',
        'departamento.nombre',
        'decreto.nombre',
        'tipo.nombre',
        'subTipo.nombre',
        'caracterizacion.nombre',
        'rama.nombre',  
        [
            'class' => 'yii\grid\CheckboxColumn'
        ],
    ],
]); ?>

返回对象的其他网格具有相同的代码结构..没有什么不同......甚至在模型中也没有。搜索模型代码是这样的:

class LimitesSearch extends Limites
{
    public $departamento, $decreto, $tipo, $subTipo, $caracterizacion, $rama;

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['id', 'Departamento_id', 'Decreto_id', 'Caracterizacion_id'], 'integer'],
            [['Tipo_id', 'SubTipo_id', 'Rama_id'], 'each', 'rule'=>['integer']],
            [['liminf', 'limsup'], 'number'],
            [['rama','caracterizacion','subTipo','tipo','decreto','departamento','existente'], '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 = Limites::find();

        $query->joinWith(['departamento', 'decreto', 'tipo', 'subTipo', 'caracterizacion', 'rama']);

        $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;
        }

        $query->andFilterWhere([
            'id' => $this->id,
            'liminf' => $this->liminf,
            'limsup' => $this->limsup,
            'Departamento_id' => $this->Departamento_id,
            'Decreto_id' => $this->Decreto_id,
            'Tipo_id' => $this->Tipo_id,
            'SubTipo_id' => $this->SubTipo_id,
            'Caracterizacion_id' => $this->Caracterizacion_id,
            'Rama_id' => $this->Rama_id,
        ]);

        $query->andFilterWhere(['like', 'existente', $this->existente]);
        $query->andFilterWhere(['like', 'departamento.nombre', $this->departamento]);
        $query->andFilterWhere(['like', 'decreto.nombre', $this->decreto]);
        $query->andFilterWhere(['like', 'tipo.nombre', $this->tipo]);
        $query->andFilterWhere(['like', 'subTipo.nombre', $this->subTipo]);
        $query->andFilterWhere(['like', 'caracterizacion.nombre', $this->caracterizacion]);
        $query->andFilterWhere(['like', 'rama.nombre', $this->rama]);

        return $dataProvider;
    }
}

和控制器/功能:

public function actionSelect()
{
    if(Yii::$app->user->can('limites-index'))
    {    
        $searchModel = new LimitesSearch();
        $dataProvider = $searchModel->search(['LimitesSearch'=>Yii::$app->request->queryParams]);
        return $this->renderAjax('select', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
    }
}

PS: 我注意到只有关系表模型中有dataProvider的网格才会返回对象和这个对象,这实际上不是关系表模型只返回id ..为什么会发生这种情况?...不知道,也许我可以通过添加CheckboxColumn选项函数来解决这个问题..但我想知道为什么会发生这种情况

编辑: 这就是我想要的......这来自关系表模型

<tr data-key="{&quot;Decreto_id&quot;:1,&quot;Tipo_id&quot;:3}"><td>Normas Sanitarias de Calidad del Agua Potable</td><td>Capitulo 2 Aspectos Microbiologicos</td><td><input name="selection[]" value="{&quot;Decreto_id&quot;:1,&quot;Tipo_id&quot;:3}" type="checkbox"></td></tr>
<tr data-key="{&quot;Decreto_id&quot;:1,&quot;Tipo_id&quot;:4}"><td>Normas Sanitarias de Calidad del Agua Potable</td><td>Capitulo 3 - Aspectos organolépticos, físi...</td><td><input name="selection[]" value="{&quot;Decreto_id&quot;:1,&quot;Tipo_id&quot;:4}" type="checkbox"></td></tr>
<tr data-key="{&quot;Decreto_id&quot;:1,&quot;Tipo_id&quot;:5}"><td>Normas Sanitarias de Calidad del Agua Potable</td><td>Capitulo 4 - Los aspectos radiactivos</td><td><input name="selection[]" value="{&quot;Decreto_id&quot;:1,&quot;Tipo_id&quot;:5}" type="checkbox"></td></tr>

但这是我从表中得到的,我从非关系表模型中提取

<tr data-key="1104"><td>1</td><td>0</td><td>0</td><td>Agua</td><td>Normas Sanitarias de Calidad del Agua Potable</td><td>Capitulo 2 Aspectos Microbiologicos</td><td>Articulos 8, 9,10,11,12,13</td><td>Organismos coliformes</td><td>NULL</td><td><input name="selection[]" value="1104" type="checkbox"></td></tr>
<tr data-key="1105"><td>2</td><td>0</td><td>5</td><td>Agua</td><td>Normas Sanitarias de Calidad del Agua Potable</td><td>Capitulo 2 Aspectos Microbiologicos</td><td>Articulos 8, 9,10,11,12,13</td><td>Organismos coliformes Totales</td><td>NULL</td><td><input name="selection[]" value="1105" type="checkbox"></td></tr>
<tr data-key="1106"><td>3</td><td>0</td><td>0</td><td>Agua</td><td>Normas Sanitarias de Calidad del Agua Potable</td><td>Capitulo 2 Aspectos Microbiologicos</td><td>Articulos 8, 9,10,11,12,13</td><td>Examen Virus</td><td>NULL</td><td><input name="selection[]" value="1106" type="checkbox"></td></tr>
<tr data-key="1107"><td>4</td><td>0</td><td>0</td><td>Agua</td><td>Normas Sanitarias de Calidad del Agua Potable</td><td>Capitulo 2 Aspectos Microbiologicos</td><td>Articulos 8, 9,10,11,12,13</td><td>Examen de Bacterias</td><td>NULL</td><td><input name="selection[]" value="1107" type="checkbox"></td></tr>
你可以看到

第一个表格在复选框值中,data-key值包含JSON个对象..但在第二个表中只有行的ID

1 个答案:

答案 0 :(得分:1)

data-key数据属性保存GridView的每一行所关联的记录的主键值。

对于单个主键,它是一个简单的数字,如果是复合主键(例如在具有多对多关系的表中使用),则它是对象,否则无法解决它。在这两种情况下,这仍然是DOM中的字符串,因为它是属性值。

yii.gridView.js用于获取yii\grid\CheckboxColumn的所选行:

getSelectedRows: function () {
    var $grid = $(this);
    var data = gridData[$grid.attr('id')];
    var keys = [];
    if (data.selectionColumn) {
        $grid.find("input[name='" + data.selectionColumn + "']:checked").each(function () {
            keys.push($(this).parent().closest('tr').data('key'));
        });
    }
    return keys;
},

当您在Javascript中获得选定的行时,将调用此方法:

$('#grid').yiiGridView('getSelectedRows');