У меня есть стол человек (id_person, name_person, id_color) и стол цвета (id_color, name_color).
Мне нужно показать имена людей и цветное имя каждого человека внутри компонента Select2.
Я использую компонент Select2, очень похожий на Картик-v / yii2-виджет-Выбор2 а также 2 amigos/yii2-select2-widget.
Я могу сделать это, создав массив с 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;
}
Я надеюсь, что кто-то может улучшить это.
Если вы определили отношения между моделями, более понятный и оптимизированный способ может быть таким, как показано ниже.
Я предполагаю, что вы связаны с именем 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'));
}