Yii2:has_many gridview和detailview

时间:2016-01-27 21:31:28

标签: php yii2

我将在我的Yii2项目中使用第一个规范化表格,所以我已经添加了这样的表格 | id | post_id | tag_id |
当我发布模型时,我已经写了这个:

public function getTags()
{
    return $this->hasMany(PostTags::className(), ['post_id' => 'id']);
}

在视图小部件中,我添加了' tags.tag_id',但它没有显示任何数据。
有没有办法在 DetailView GridView 小部件中显示此标记?

可能是,我可以写" group_concat"某处?

1 个答案:

答案 0 :(得分:1)

我建议编写一个小部件来显示相关记录的链接列表。它是可重用的,可以防止模型/控制器中的HTML生成,减少视图中的代码量。

<?php

namespace common\widgets;

use yii\base\Widget;
use yii\helpers\Html;

/**
 * Widget for display list of links to related models
 */
class RelatedList extends Widget
{
    /**
     * @var \yii\db\ActiveRecord[] Related models
     */
    public $models = [];

    /**
     * @var string Base to build text content of the link.
     * You should specify attribute name. In case of dynamic generation ('getFullName()') you should specify just 'fullName'.
     */
    public $linkContentBase = 'name';

    /**
     * @var string Route to build url to related model
     */
    public $viewRoute;

    /**
     * @inheritdoc
     */
    public function run()
    {
        if (!$this->models) {
            return null;
        }

        $items = [];
        foreach ($this->models as $model) {
            $items[] = Html::a($model->{$this->linkContentBase}, [$this->viewRoute, 'id' => $model->id]);
        }

        return Html::ul($items, [
            'class' => 'list-unstyled',
            'encode' => false,
        ]);
    }
}

以下是一些示例(假设标记名称存储在name列中)。

GridView中的用法:

[
    'attribute' => 'tags',
    'format' => 'raw',
    'value' => function ($model) {
        /* @var $model common\models\Post */
        return RelatedList::widget([
            'models' => $model->tags,
            'viewRoute' => '/tags/view',
        ]);
    },
],

DetailView中的用法:

/* @var $model common\models\Post */

...

[
    'attribute' => 'tags',
    'format' => 'raw',
    'value' => RelatedList::widget([
        'models' => $model->tags,
        'viewRoute' => '/tags/view',
    ]),        
],

不要忘记设置格式raw,因为默认情况下,内容会呈现为纯文本以防止XSS攻击(html特殊字符被转义)。

您可以根据自己的需要进行修改,这只是一个例子。