【问题标题】:How to creat a multi model CGridView如何创建多模型 CGridView
【发布时间】:2011-12-16 14:28:08
【问题描述】:

如何在 Yii 框架中创建多模型 CGridView。我搜索了 Yii 的文档。

以下是我需要的两个表格

表:user_master

+---------+----------+-------------+-------------+
| user_id | name     | email       | active      |  
|   1     | Darshit  | abc@xyz.com | true        |  
|   2     | Obed     | abc@xyz.com | true        |  
|   3     | abmed    | abc@xyz.com | true        |  
|   4     | clutch   | abc@xyz.com | true        |  
|   5     | sirisb   | abc@xyz.com | true        |  
+---------+----------+-------------+-------------+

表:friend_master

+---------+-----------+--------------+-------------+  
| user_id | friend_id | date_created | is_deleted  |  
+---------+-----------+--------------+-------------+    
|   1     |    2      | 2011-12-14   | false       |  
|   1     |    5      | 2011-12-14   | false       |  
|   3     |    5      | 2011-12-14   | false       |  
|   2     |    4      | 2011-12-14   | false       |  
|   1     |    3      | 2011-12-14   | false       |  
|   5     |    2      | 2011-12-14   | false       |  
+---------+-----------+--------------+-------------+  

我想要这样的网格:

我已经创建了两个表的模型,但它们只显示单个模型网格视图。

所以,我没有办法做到这一点。任何帮助都将不胜感激。

【问题讨论】:

    标签: php gridview yii


    【解决方案1】:

    看起来您不需要多模型网格视图。您根据需要提供的网格仅显示一个模型 user_master 的元素。属性“Friends”实际上属于该模型,因为它是与 user_master 表的每个特定实例相关的值。因此,您实际上可以将属性“Friends”想象为 user_master 表中的一个额外列。您无需将该行添加到表中,只需在模型中声明为属性即可。将以下行添加到 user_master 模型的 'relations' 函数返回的数组中:

    'FriendsCount'=> array(self::STAT, 'friend_master', 'user_id'),
    

    您可以在此处阅读有关其工作原理的更多信息:http://www.yiiframework.com/doc/api/1.1/CActiveRecord/#relations-detail

    简而言之,STAT 类型的关系只是检索模型的统计值。在这种特殊情况下,它只会计算与 user_master 模型的每个实例相关的朋友数。

    现在,在 CGridView 定义中,您必须声明要显示的 3 列。这是在“列”数组中完成的。当然,'user_id' 和 'name' 将被识别为正在显示的模型的显式声明属性,因此我们不需要关心它们。但是对于“朋友”列,您可能需要明确指定我们要显示的值。这只需使用数组即可完成:

    <?php $this->widget('zii.widgets.grid.CGridView', array(
            ...
        ...
        'columns'=>array(
            'user_id',
            'name',
                 array(
                   'class'=>'CDataColumn',
               'name'=>'Friends',
               'value'=>'$data->FriendsCount',  //The FriendsCount relation we declared                              
                 ),
        ),
    )); 
    ?>
    

    您可能会注意到,使用这种基于数组的语法,您可以声明用途广泛的列。

    希望这篇文章对您有所帮助。

    【讨论】:

    • 非常感谢您的回复,我将应用您提供的解决方案。很快就会回复你。非常感谢@Alfredo
    • 嘿,@Alfredo 它工作得很好,感谢您的帮助.. 但是我现在无法对该列进行排序。那么,能否请您告诉我如何在 Friends 列上应用排序..
    • 好的。我们所要做的就是在 user_master 模型的 AttributesLabes 函数中添加以下行:'FriendCount' => 'Friends',现在从 gridview 声明中删除 'value' 行。最后只需将“name”属性的值修改为“FriendsCount”。它应该可以完成工作。
    • 嘿,@alfredo 我已经完成了你所说的 sorting 该字段.. 但它对我没有用.. :( 任何其他解决方案? ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    相关资源
    最近更新 更多