yii2关系

时间:2015-08-08 12:52:51

标签: php gridview yii2

我有3个表,我通过使用Field表与What表建立了关系。我想在Gridview中的What表中显示名称行。但是它显示了由逗号分隔的数据行。我希望每个数据都在不同的列中。喜欢带有重复字段的sql查询结果。
这是我的tbon.php模型:

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和a然后在下一行ID和b等。
任何帮助将不胜感激!

1 个答案:

答案 0 :(得分: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. 向您的模型添加一种抓取数据的方法
  4. 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;
    
    }