2015-08-08 6 views
0

У меня есть 3 таблицы, и я сделал отношение к какой таблице с помощью таблицы полей. Я хочу показать строку имени из какой таблицы в Gridview.but, она показывает мне строку данных, разделенных запятой. Я хочу, чтобы все данные в разных столбцах. как результат запроса sql с повторным полем.
это моя tbon.php модель:yii2 отдельные данные запятой в gridview для каждой записи отношения

public function getWhat() 
    { 
     return $this->hasMany(What::className(), ['idw' => 'idw']) 
      ->viaTable('Field', ['id' => 'id']); 
    } 
public function getField() 
    { 
     return $this->hasMany(Field::className(), ['id' => 'id']); 
    } 

и TbonSearch.php я добавил эти коды:

public $what; 
public $field; 

и

[['field','what'],'safe'] 

и в методе поиска, у меня есть добавлено:

$query = Tbon::find() 
      ->joinWith(['field']) 
      ->joinWith(['what']); 

и для сортировки:

$dataProvider->sort->attributes['what'] = [ 
      'asc' => ['what.name' => SORT_ASC], 
      'desc' => ['what.name' => SORT_DESC], 

     ]; 

и добавить фильтра поиска:

->andFilterWhere(['like', 'what.name', $this->what]); 

в индексе я добавил этот код и здесь есть проблема, я думаю:

<?= GridView::widget([ 
     'dataProvider' => $dataProvider, 
     'filterModel' => $searchModel, 
     'columns' => [ 
      ['class' => 'yii\grid\SerialColumn'],   
      'id', 
      [ 
       'label'=>'Name', 
       'attribute' => 'what', 
       'value' => function ($data) { 
        $str = ''; 
        foreach($data->what as $name) { 
         $str .= $name->name.','; 
        } 
        return $str; 
       }, 
      ], 

данные например: a, b, c, d для поля имени! но я хочу ID, а затем в следующем ряду ID и b и т. д.
любая помощь будет оценена!

ответ

0

Я не знаю вашего кода, и я не понимаю смысла, но я могу ответить в целом.

GridView используется для просмотра данных в сетке. Строка в GridView представляет собой набор данных и представляет данные в виде таблицы.

foreach($data->what as $name) { 
        $str .= $name->name.','; 
       } 

Я предполагаю, что вы хотите, чтобы отобразить Имя атрибут из соотношения , что. Вы можете просто добиться этого с помощью синтаксиса tablename.columnname.

<?= GridView::widget([ 
    'dataProvider' => $dataProvider, 
    'filterModel' => $searchModel, 
    'columns' => [ 
     ['class' => 'yii\grid\SerialColumn'],   
     'id', 
     [ 
      'label'=>'Name', 
      'attribute' => 'what.name', 
     ], 

Если вы хотите отобразить столбец ID дополнительно:

<?= GridView::widget([ 
    'dataProvider' => $dataProvider, 
    'filterModel' => $searchModel, 
    'columns' => [ 
     ['class' => 'yii\grid\SerialColumn'],   
     'id', 
     [ 
      'label'=>'Name', 
      'attribute' => 'what', 
      'value' => function ($data) { 
       $str = ''; 
       foreach($data->what as $name) { 
        $str .= ' '; 
        $str .= $name->id.''; 
        $str .= $name->name.','; 
       } 
       return $str; 
      }, 
     ], 

Чтобы быть более точным (в терминах вашей проблемы). У нас есть датамодель с таблицей соединений, например, следующая простая книжная база данных.

datamodel of a simple book database

Пример:

Если вы хотите, чтобы отобразить имена авторов на стандартный CRUD сгенерирована индекс Gridview, вы можете сделать что-то вроде этого:

<?= GridView::widget([ 
    'dataProvider' => $dataProvider, 
    'filterModel' => $searchModel, 
    'columns' => [ 
     ['class' => 'yii\grid\SerialColumn'], 

     'id', 
     'book_name', 
     [ 
      'label'=>'Author(s)', 
      'value' => function ($dataProvider) { 
       $str = ''; 
       foreach($dataProvider->authors as $name) { 
        $str .= ' '; 
        $str .= $name->id.' '; 
        $str .= $name->author_name.','; 
       } 
       return $str; 
      }, 
     ], 

     ['class' => 'yii\grid\ActionColumn'], 
    ], 
]); ?> 

с результатом :

index books

Кроме того, вы можете редактировать подробный вид, чтобы отображать такую ​​информацию в дополнительном Gridview. Результат может выглядеть так.

detail view of a book

Для достижения этой цели необходимо:

  1. добавить поставщика данных в контроллер и передать поставщику на представление
  2. добавить GridView виджет на ваш взгляд, и подключить данные поставщик
  3. добавить метод к вашей модели, которая ползает данные

view.php ака зрения

use yii\grid\GridView; 

// other code 

<?= GridView::widget([ 
    'dataProvider' => $dataProvider, 
     'columns' => [ 
     'id', 
     [ 
      'attribute' => 'author.author_name', 
      'header' => 'Author(s)', 
     ], 
    ], 

]); ?> 

BookController.php ака контроллер

public function actionView($id) 
{ 
    $dataProvider = Book::getAllAuthors($id); 
    return $this->render('view', [ 
     'model' => $this->findModel($id), 
     'dataProvider' => $dataProvider, 
    ]); 
} 

Book.php ака модели

use \yii\data\ActiveDataProvider; 

// other code 

public static function getAllAuthors($id) { 

    $query = BookAuthor::find()->where(['book_id' => $id]); 
    $dataProvider = new ActiveDataProvider([ 
     'query' => $query, 
    ]); 

    return $dataProvider; 

} 
+0

да я хочу сделать это! но я не могу. потому что мое отношение HasMany и оно возвращает массив, поэтому я не могу использовать способ, о котором вы упоминали. Когда я делаю то, что он показывает [не установлен]. и еще одна вещь ... моя таблица - tbwhats, и я использую то, что для отношения, как вы можете видеть в функции getWhat. – mayhem

+0

, чтобы дать правильный ответ: можете ли вы загрузить схему базы данных? – R13e

+0

Спасибо R13e за подробный ответ. Моя цель - именно в результате того, что вы указали в книге «Авторы». там вы можете видеть, что вы показали всех писателей книги только в одном поле ... 1 Дуглас, 3 Гарри, 2 Джейн ... и разделите их на «,». я хочу сделать 3 избыточных строки и в каждом Дугласе, другой Гарри, а третий - Джейн. точно так же, как показано в дополнительном Gridview, но плюс повторение идентификатора и имени книги. Еще раз спасибо. – mayhem

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