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

时间:2018-04-19 11:02:54

标签: php yii2 jquery-select2 database-table kartik-v

我有表人(id_person,name_person,id_color)和表颜色(id_color,name_color)

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

我使用的Select2组件与kartik-v/yii2-widget-select22amigos/yii2-select2-widget非常相似。

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

2 个答案:

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