yii2 - 用来自数据库的两个 table 的数据填充 table

yii2 - fill table with data from two tables from database

我用过 Yii 和 Yii2 几次...每次使用它时我都迷失在这个框架中。实际上,Yii 非常强大,它为你做了很多事情,但有时你会因此而迷失方向,你不知道发生了什么,也不知道如何做一些简单的事情。现在我试图用来自 2 个相关 table 的数据填充 table。我读过 Yii 论坛、Whosebug 主题、youtube……但没有任何效果。我的配置是Yii2 advanced.

在 postgres 中,我有两个 tables:

问题是,在我的 Options/index 中,我想像这样在 table 中显示工具名称(GridView?):

| Tool_name | Option_name |输入 |

另一个选项可能是通过 DropDownList 过滤 table,我可以在其中选择一个工具并更新 table。如果未选择任何工具,则显示所有数据。我不知道哪个选项可以更简单,两者都对我有效。

有人可以给我一些灯吗?我会很感激...谢谢!!

在选项模型中您需要添加以下内容

    public function getTools()
    {
        return $this->hasOne(Options::className(), ['id' => 'tool_id']);
    }


    public function getToolName() {
        return $this->tools->tool_name;
    }

然后在toolName的gridview中会有一个可用的字段

您要找的是relations.

这将是您工具模型中的 hasMany

public function getOptions() {
  return $this->hasMany(Options::className(), ['tool_id' => 'id']);
}

还有一个 hasOne 在你的选项模型中:

public function getTool() {
  return $this->hasOne(Tools::className(), ['id' => 'tool_id']);
}

现在$model = Tools::find()->all()也会通过$model->options给你相关数据。选项反之亦然。

由于您可能需要所有工具和所有选项,您的 $dataProvider 将是选项,而不是工具。对于每个选项,您都会获得相关工具。

相关数据可以用

显示在gridview中
 [
 'attribute' => 'tools',
 'value' => 'tools.tool_name'
 ],

参考this article

此外,如果您使用它创建模型,Gii 会为您生成这些关系。 (请注意,如果您不在 localhost 上工作,则需要在 allowedIPs 中设置您的 IP 地址,否则它不会显示。)

最好的方法是使用活动模型中实现的关系。

1) 在模型中定义关系

如果您使用 Gii 从数据库中生成模型 classes,那么关系可能已经定义好了。

它应该是这样的

class Option extends \yii\db\ActiveRecord
{
    public function getTool()
    {
        return $this->hasOne(Tool::class, ['id' => 'tool_id']);
    }
    
    //... other code of the model
}

在模型 class 中定义关系将允许您访问相关模型作为该对象的 属性。例如,上面定义的方法将允许您执行类似 $option->tool->tool_name.

的操作

2) 强制预加载关系

默认情况下,Yii 中的关系使用“延迟加载”。这意味着相关模型在第一次访问之前不会从数据库中加载。当您使用单个模型时这很好,因为您可能会或可能不会使用该相关模型。但是,如果您要在 table 中输出多个模型,并且每个模型都将访问相关模型,则延迟加载将导致对 table 的每一行进行额外的查询。 为了避免这种情况,我们想对 ActiveQuery 说它应该在加载 option 模型时为我们的 tool 关系加载所有相关模型。这称为“急切加载”。为此,您必须在为数据提供者创建查询时使用 with() 方法。

例如像这样:

$query = Option::find()
  ->with('tool'); //the param is name of relation

3) 将相关模型中的列添加到 GridView

现在您可以简单地将相关模型中的列添加为 relation.column 在您的情况下它将是 tool.tool_name.

示例:

<?= yii\grid\GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        'tool.tool_name',
        'option_name',
        'type',
    ]
]);