Yii2: как показать данные из двух связанных таблиц?

У меня есть стол человек (id_person, name_person, id_color) и стол цвета (id_color, name_color).

Мне нужно показать имена людей и цветное имя каждого человека внутри компонента Select2.

Я использую компонент Select2, очень похожий на Картик-v / yii2-виджет-Выбор2 а также 2 amigos/yii2-select2-widget.

Я могу сделать это, создав массив с SQL-запросом, но я хотел бы знать, предоставляет ли Yii2 лучшее и простое решение.

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;
}

Я надеюсь, что кто-то может улучшить это.

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'));
}
0