我有表人(id_person,name_person,id_color)和表颜色(id_color,name_color)。
我需要在Select2组件中显示每个人的姓名和颜色名称。
我使用的Select2组件与kartik-v/yii2-widget-select2和2amigos/yii2-select2-widget非常相似。
我可以创建一个带有SQL查询的数组,但我想知道Yii2是否提供了更好,更简单的解决方案。
答案 0 :(得分:0)
此解决方案有效但我不认为这是最好的:
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;
}
我希望有人可以改进它。
答案 1 :(得分:0)
如果您已经定义了模型之间的关系,那么更清洁和优化的方式可能如下所示。
我假设您在getColor()
模型中与名称Persons
建立了关系。将您的函数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;
});
}
以上将返回一个如下所示的数组
{
"1": "omer aslam - red",
"2": "irfan ashraf - blue",
"3": "shaban khan - pink",
"4": "rana touqeer - red",
"5": "sajjad - blue"
}
如果您正在为不看情况的人保存多种颜色,因为您没有联结表并且颜色是针对person
表中的persons
保存的,但无论如何它是one-to-many
然后将ArrayHelper::map()
内的回调函数更改为以下,以便显示与该人关联的所有颜色。
function($persons) {
return $persons->name_person . '-' . implode(",",\yii\helpers\ArrayHelper::getColumn($persons->color, 'name_color'));
}