2016-01-27 6 views
1

Я собираюсь использовать первую форму нормализации в своем проекте Yii2, поэтому я добавил таблицу, подобную этому
| id | post_id | tag_id |
и когда я на должность модели я writed это:Yii2: has_many gridview и detailview

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

В виджете я добавил «tags.tag_id», но он не показывает никаких данных.
Есть ли способ показать эти теги в DetailView и GridView widgets?

Может быть, я могу написать «group_concat» где-нибудь?

+0

Я нашел проблему. Я не добавил ** joinWith ** к запросу DataProvider –

ответ

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 специальные символы экранированы).

Вы можете изменить это в соответствии со своими потребностями, это всего лишь пример.

+0

Проблема в том, что мне нужно что-то вроде «tags.id». Когда я использую отношение hasOne, мне просто нужно написать «tags.id», и он отображает только один выбранный элемент, но если я использую несколько идентификаторов, он не работает –

Смежные вопросы