Php Yii2:如何显示来自两个相关表的数据?

Php Yii2:如何显示来自两个相关表的数据?,php,yii2,jquery-select2,database-table,kartik-v,Php,Yii2,Jquery Select2,Database Table,Kartik V,我有表人物(id\u人物,姓名,id\u颜色)和表颜色(id\u颜色,姓名\u颜色) 我需要显示Select2组件中每个人的姓名和颜色名称 我使用的Select2组件非常类似于和 我可以用SQL查询创建一个数组,但我想知道Yi2是否提供了一个更好、更简单的解决方案。此解决方案可行,但我认为它不是最好的: public function personsList() { $persons = \app\models\Persons::find()->orderBy('name_pers

我有表人物(id\u人物,姓名,id\u颜色)和表颜色(id\u颜色,姓名\u颜色)

我需要显示Select2组件中每个人的姓名和颜色名称

我使用的Select2组件非常类似于和


我可以用SQL查询创建一个数组,但我想知道Yi2是否提供了一个更好、更简单的解决方案。

此解决方案可行,但我认为它不是最好的:

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
模型中与th name
getColor()
有关系。将函数
PersonList()
更改为以下内容

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"
}
编辑 如果您针对没有连接表的人员保存了多个颜色,而该人员看起来不符合要求,并且颜色针对
persons
表中的
person
保存,但无论如何,如果是
one-to-many
,则更改
ArrayHelper::map()中的回调函数
以显示与此人相关的所有颜色

function($persons) {
    return $persons->name_person . '-' . implode(",",\yii\helpers\ArrayHelper::getColumn($persons->color, 'name_color'));
}

一对一
还是
一对多
颜色
表的关系,意味着一个人可以指定一种颜色或多种颜色,这是一对多。在您的回答中,您使用
findOne()
而不是
findAll()
来获得与
个人id
对应的颜色,这表明只有一种颜色保存在一个人身上?我在下面添加了一个答案,看看是否有帮助。我希望您没有在
id\u color
中的
persons
表中保存逗号分隔的值,否则如果我没有错的话,您应该有一个连接表来具有一对多关系