Yii2:如何显示来自两个相关表的数据?
Yii2: how to show data from two related tables?
我有 table 人(id_person、name_person、id_color) 和 table 颜色(id_color, name_color).
我需要在 Select2 组件中显示人名和每个人的颜色名称。
我正在使用与 kartik-v/yii2-widget-select2 and 2amigos/yii2-select2-widget 非常相似的 Select2 组件。
我可以通过 SQL 查询创建一个数组,但我想知道 Yii2 是否提供了更好更简单的解决方案。
这个解决方案有效,但我认为它不是最好的:
public function personsList()
{
$persons = \app\models\Persons::find()->orderBy('name_person')->all();
$personsList = yii\helpers\ArrayHelper::map($persons, 'id_person', function($persons) {
$color = \app\models\Colors::findOne(['id_color' => $persons->id_color]);
$name_color = $color->name_color;
return $persons->name_person . ' - ' . $name_color;
});
return $personsList;
}
希望有人能改进一下
如果您已经定义了模型之间的关系,那么更简洁和优化的方式可能如下所示。
我假设你在你的 Persons
模型中与名字 getColor()
有关系。将您的函数 personsList()
更改为以下内容。
public function personsList() {
$persons = rsons::find()->with('color')->orderBy('name_person')->all();
return ArrayHelper::map($persons, 'id_person', function($persons) {
return $persons->name_person . ' - ' . $persons->color->name_color;
});
}
上面的内容 return 你会得到一个像下面这样的数组
{
"1": "omer aslam - red",
"2": "irfan ashraf - blue",
"3": "shaban khan - pink",
"4": "rana touqeer - red",
"5": "sajjad - blue"
}
编辑
如果您针对人物保存多种颜色,因为您没有连接点 table 并且看起来并非如此,并且颜色针对 persons
中的 person
table,但无论如何,如果它是 one-to-many
,则将 ArrayHelper::map()
中的回调函数更改为以下,以便它向您显示与此人相关的所有颜色。
function($persons) {
return $persons->name_person . '-' . implode(",",\yii\helpers\ArrayHelper::getColumn($persons->color, 'name_color'));
}
我有 table 人(id_person、name_person、id_color) 和 table 颜色(id_color, name_color).
我需要在 Select2 组件中显示人名和每个人的颜色名称。
我正在使用与 kartik-v/yii2-widget-select2 and 2amigos/yii2-select2-widget 非常相似的 Select2 组件。
我可以通过 SQL 查询创建一个数组,但我想知道 Yii2 是否提供了更好更简单的解决方案。
这个解决方案有效,但我认为它不是最好的:
public function personsList()
{
$persons = \app\models\Persons::find()->orderBy('name_person')->all();
$personsList = yii\helpers\ArrayHelper::map($persons, 'id_person', function($persons) {
$color = \app\models\Colors::findOne(['id_color' => $persons->id_color]);
$name_color = $color->name_color;
return $persons->name_person . ' - ' . $name_color;
});
return $personsList;
}
希望有人能改进一下
如果您已经定义了模型之间的关系,那么更简洁和优化的方式可能如下所示。
我假设你在你的 Persons
模型中与名字 getColor()
有关系。将您的函数 personsList()
更改为以下内容。
public function personsList() {
$persons = rsons::find()->with('color')->orderBy('name_person')->all();
return ArrayHelper::map($persons, 'id_person', function($persons) {
return $persons->name_person . ' - ' . $persons->color->name_color;
});
}
上面的内容 return 你会得到一个像下面这样的数组
{
"1": "omer aslam - red",
"2": "irfan ashraf - blue",
"3": "shaban khan - pink",
"4": "rana touqeer - red",
"5": "sajjad - blue"
}
编辑
如果您针对人物保存多种颜色,因为您没有连接点 table 并且看起来并非如此,并且颜色针对 persons
中的 person
table,但无论如何,如果它是 one-to-many
,则将 ArrayHelper::map()
中的回调函数更改为以下,以便它向您显示与此人相关的所有颜色。
function($persons) {
return $persons->name_person . '-' . implode(",",\yii\helpers\ArrayHelper::getColumn($persons->color, 'name_color'));
}