Yii2- 一个 GridView 中来自两个模型的数据

Posted

技术标签:

【中文标题】Yii2- 一个 GridView 中来自两个模型的数据【英文标题】:Yii2- data from two models in one GridView 【发布时间】:2015-03-26 12:14:28 【问题描述】:

我使用 yii2,我有两个带键的表:

第一:

machine

machine_serial PK,name

第二: 操作系统

id PK,os_name, machine_serial PFK

关于关系 1:N

我使用 CRUD 为机器和操作系统生成模型 我想在一个视图中使用 GridView 从两个模型中获取数据,我一直在使用主键数据

我的网格视图:

GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel'  => $searchModel,
    'columns'      => [
        'os_name',
        'machine_serial',
        'machine.name',
        [
            'class'          => 'yii\grid\ActionColumn',
            'contentOptions' => ['style' => 'width:50px;'],
            'header'         => 'Actions',
            'template'       => 'view',
            'buttons'        => [
                //view button
                'view' => function ($url, $dataProvider) 
                    return html::a('view',
                        ['view', 'id' => $dataProvider->id, 
                        'machine_serial' => $dataProvider->machine_serial],
                        ['class' => 'btn btn-primary']);
                ,
            ]
        ],
    ],
]);

但我得到错误:

获取未知属性:backend\models\Node::machine

我是初学者,所以请帮忙:)

型号操作系统:

namespace backend\models;
use Yii;

class Node extends \yii\db\ActiveRecord

    /**
     * @inheritdoc
     */
    public static function tableName()
    
        return 'os';
    

    /**
     * @inheritdoc
     */
    public function rules()
    
        return [
            [['id'], 'integer'],
            [['machine_serial'], 'string', 'max' => 8]
        ];
    

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    
        return [
            'id' => 'ID',
            'machine_serial' => 'Machine Serial',
        ];
    

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getMachineSerial()
    
        return $this->hasOne(Machine::className(), ['machine_serial' => 'machine_serial']);
    


模型机:

namespace backend\models;

use Yii;
use yii\db\Query;

class Machine extends \yii\db\ActiveRecord

    /**
     * @inheritdoc
     */
    public static function tableName()
    
        return 'machine';
    

    /**
     * @inheritdoc
     */
    public function rules()
    
        return [
            [['machine_serial'], 'required'],
            [['name'], 'string', 'max' => 30]
        ];
    

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    
        return [
            'machine_serial' => 'Machine Serial',
            'name' => 'Name',
           ];
    
    /**
     * @return \yii\db\ActiveQuery
     */
    public function getOs()
    
        return $this->hasMany(Os::className(), ['machine_serial' => 'machine_serial']);
      

在操作系统控制器中:

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

        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,

        ]);
    

【问题讨论】:

您能出示您的型号代码吗? 并显示$dataProvider 代码。 好的,我更新我的查询 【参考方案1】:

在您的 GridView 中,您已声明 'machine.name'。但是机器不是您的节点模型对象的属性。在 Node 类中,您有方法 getMachineSerial()

我认为方法名称是错误的。我猜它应该是getMachine()。如果你重命名它,我会假设 'machine.name' 会起作用。

或者您可以在 GridView 的列部分将 'machine.name' 替换为 'machineSerial.name'

【讨论】:

以上是关于Yii2- 一个 GridView 中来自两个模型的数据的主要内容,如果未能解决你的问题,请参考以下文章

Yii2 GridView 按年份过滤日期

Yii2 gridview过滤来自多个值的列表(不是下拉列表过滤器)

YII2 gridview问题的弹出窗口

Yii2:Gridview过滤器中的kartik\Select2下拉列表

Yii2 GridView与ArrrayDataProvider搜索

隐藏 Yii2 GridView 操作按钮