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:
- table 'tools' 字段 'id(int)' 和 'tool_name(varchar)'.
- table 'options' 字段为 'id(int)'、'tool_id(int - Foreign Key from tools)'、'option_name(varchar)'、'type(int)'。
问题是,在我的 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',
]
]);
我用过 Yii 和 Yii2 几次...每次使用它时我都迷失在这个框架中。实际上,Yii 非常强大,它为你做了很多事情,但有时你会因此而迷失方向,你不知道发生了什么,也不知道如何做一些简单的事情。现在我试图用来自 2 个相关 table 的数据填充 table。我读过 Yii 论坛、Whosebug 主题、youtube……但没有任何效果。我的配置是Yii2 advanced.
在 postgres 中,我有两个 tables:
- table 'tools' 字段 'id(int)' 和 'tool_name(varchar)'.
- table 'options' 字段为 'id(int)'、'tool_id(int - Foreign Key from tools)'、'option_name(varchar)'、'type(int)'。
问题是,在我的 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',
]
]);