返回

如何解决 Yii GridView 中的 '(未设置)' 列?使用 COALESCE 函数轻松解决

php

如何解决 Yii GridView 中的 (未设置) 列?

概述

使用 Yii GridView 呈现数据时,经常会遇到 Autor、Anio 或 Resumen 等特定列显示为 "(未设置)" 的问题。这通常是由关联查询中关联表中缺少记录造成的。本文将介绍如何使用 COALESCE 函数来解决此问题。

问题根源

在关联查询中,如果没有与主表关联的记录,则关联列将返回 NULL。当 GridView 尝试呈现这些 NULL 值时,就会显示 "(未设置)"。

解决方案

要解决此问题,可以使用 COALESCE 函数。COALESCE 函数接受一组表达式,并返回第一个非空值。这使我们能够在关联表中没有记录时显示替代值。

修改查询

要使用 COALESCE 函数,需要修改关联查询。以下是如何修改 ScientificProduction 模型中的关联查询:

public function getLibro()
{
    return $this->hasOne(Libros::class, ['Libro_id' => 'P_id'])
        ->select(['Autor', 'Anio', 'Titulo', 'Resumen']);
}

// Define relacion con cap_libros table
public function getCapLibro()
{
    return $this->hasOne(CapLibros::class, ['Cap_id' => 'P_id'])
        ->select(['Autores_capitulo AS Autor', 'Anio', 'Titulo_capitulo AS Titulo', 'Resumen']);
}

// Define relacion con articulos table
public function getArticulo()
{
    return $this->hasOne(Articulos::class, ['Articulos_id' => 'P_id'])
        ->select(['Autor', 'Anio', 'Titulo', 'Resumen']);
}

修改后的查询将使用 COALESCE 函数在关联表中没有记录时返回第一个非空值。

修改 ActiveDataProvider

在修改关联查询后,还需要修改 ActiveDataProvider 查询以使用 COALESCE 函数。以下是如何修改 actionIndex 控制器中的查询:

public function actionIndex()
{
    $provider = new ActiveDataProvider([
        'query' => ScientificProduction::find()
            ->select([
                'scientific_production.P_id',
                'COALESCE(libros.Autor, cap_libros.Autores_capitulo, articulos.Autor) AS Autor',
                'COALESCE(libros.Anio, cap_libros.Anio, articulos.Anio) AS Anio',
                'COALESCE(libros.Titulo, cap_libros.Titulo_capitulo, articulos.Titulo) AS Titulo',
                'COALESCE(libros.Resumen, cap_libros.Resumen, articulos.Resumen) AS Resumen'
            ])
            ->leftJoin('libros', 'scientific_production.P_id = libros.Libro_id')
            ->leftJoin('cap_libros', 'scientific_production.P_id = cap_libros.Cap_id')
            ->leftJoin('articulos', 'scientific_production.P_id = articulos.Articulos_id'),
        'pagination' => [
            'pageSize' => 10, // Adjust page size as needed
        ],
        'sort' => [
            'attributes' => [
                'P_id',
                'Autor',
                'Anio',
                'Titulo',
                'Resumen',
            ],
        ],
    ]);

    // returns an array of Post objects
    return $this->render('index', [
        'dataProvider' => $provider,
     ]);
}

验证

运行此修改后的代码后,GridView 中的 Autor、Anio 和 Resumen 列将显示正确的值,即使关联表中没有记录。

结论

使用 COALESCE 函数可以解决 Yii GridView 中 "(未设置)" 列的问题,并确保关联表中没有记录时显示替代值。这可以大大提高数据的可读性和可用性。

常见问题解答

  • 问:为什么关联查询会返回 NULL 值?
    • 答:如果关联表中没有与主表记录匹配的记录,关联查询将返回 NULL 值。
  • 问:如何使用 COALESCE 函数?
    • 答:COALESCE 函数接受一组表达式,并返回第一个非空值。
  • 问:是否可以使用其他函数来解决此问题?
    • 答:虽然 COALESCE 函数是解决此问题的常用方法,但也可以使用其他函数,如 IFNULL 或 NVL。
  • 问:修改关联查询会影响模型的性能吗?
    • 答:修改关联查询可能会对模型的性能产生轻微影响,因为需要执行额外的查询。
  • 问:如何避免此问题将来发生?
    • 答:确保在关联表中始终存在与主表记录匹配的记录,可以防止将来出现此问题。