`
dcj3sjt126com
  • 浏览: 1877887 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在GridView中对于有外键的字段使用关联模型进行搜索和排序

    博客分类:
  • YII
yii 
阅读更多

在GridView中使用关联模型进行搜索和排序

首先我们有两个模型它们直接有关联:

class Author extends CActiveRecord {
...
}
 
class Post extends CActiveRecord {
...
    function relations() {
        return array(
            'author'=>array( self::BELONGS_TO, 'Author', 'id_author' ),
        );
    }
...
}

当以网格形式显示所有 Post 时,我们希望显示作者的名字,并且可以通过作者名字中的关键字过滤 Post。提供这些功能的最好解决方式(在我看来)是:

首先需要在 Post 模型中添加一个新的属性,它用来保存搜索的字符串(即要搜索的作者名).也可以使用外键列来实现同样的效果,但是我不喜欢这么用,在搜索条件中保存搜索的字符串而不是外键 id.你还须在搜索条件中将这个新的属性的规则设置为 safe

class Post extends CActiveRecord {
  public $author_search;
  ...
  public function rules() {
    return array(
      ...
      array( 'xxx,yyy,author_search', 'safe', 'on'=>'search' ),
    );
  }
}

现在就可以在搜索条件(标准情况-每个模型都要一个 search 方法)中使用这个属性了。同时,我们需要使用条件的 ‘with’ 属性来指定我们的 Post 是通过哪个关系来获取作者(这种方式只需一次数据库查询而不是延迟加载中的多次查询)。

$criteria = new CDbCriteria;
$criteria->with = array( 'author' );
...
$criteria->compare( 'author.username', $this->author_search, true );
...

当我们修改搜索函数时,我们对返回的 CActiveDataProvider 添加一个新的功能

return new CActiveDataProvider( 'Post', array(
    'criteria'=>$criteria,
    'sort'=>array(
        'attributes'=>array(
            'author_search'=>array(
                'asc'=>'author.username',
                'desc'=>'author.username DESC',
            ),
            '*',
        ),
    ),
));

配置中排序部分的 attributes 允许我们覆盖默认值。当我们按 author_search 字段排序的时候,它将会按照指定的规则排序,最后的 * 表示其他字段按默认排序。通过这种方式我们也可以修改默认属性的排序(例如:用户指定按 last_name 列排序时,应该使用last_name和first_name结合排序).

到现在为止我们已经为我们的网格显示做好了前期准备

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        'title',
        'post_time',
        array( 'name'=>'author_search', 'value'=>'$data->author->username' ),
        array(
            'class'=>'CButtonColumn',
        ),
    ),
));

这就是所有,我们使用用户名代替用户ID外键列来排序,并且我们可以使用姓名关键字搜索.

分享到:
评论

相关推荐

    在标准的三层架构中用GridViwe显示数据库外键的数据

    5. **绑定字段和显示外键数据**:在GridView中,为每个字段设置DataField属性,对于外键字段,可以使用TemplateField来显示关联的详细信息。例如,对于`CustomerId`字段,可以创建一个TemplateField,然后使用...

    Yii2实现让关联字段支持搜索功能的方法

    1. 模型关联(Model Relations):在Yii2中,关联模型关系通常通过定义模型类中的方法来实现,例如在Branches模型中,可能会有一个指向companies模型的关系方法。这可以通过在Branches模型中定义一个方法来实现,如`...

    devexpress主从表实现

    可以使用`GridView.Columns`集合进行列的添加、删除和配置。 - 也可以使用`GridView.OptionsBehavior`属性来定制用户交互行为,如启用/禁用编辑、多选等。 7. 性能优化: - 考虑到性能,可能需要使用分页和懒加载...

    DevExpress中GridControl 主从表如何实现

    主从表(Master-Detail)是一种常见的数据展示方式,它允许在一个表格中显示主记录,在另一个表格中显示与之关联的详细记录。下面我们将详细探讨如何在DevExpress GridControl中实现主从表。 首先,确保你已经安装...

    asp.net(c#)树型表格

    此外,对于复杂的树型表格,可能还需要实现拖放功能、搜索过滤、排序等功能,以增强用户体验。 总之,ASP.NET中的树型表格(TableTree)是通过TreeView控件结合后台数据处理和前端交互设计实现的,涉及数据库设计、...

Global site tag (gtag.js) - Google Analytics