当前位置:K88软件开发文章中心网站服务器框架Yii 2.0 → 文章内容

数据小部件(Data Widgets)

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-26 15:29:17

],]);处理关系型模型当我们在一个网格视图中显示活动数据的时候,你可能会遇到这种情况,就是显示关联表的列的值,例如:发帖者的名字,而不是显示他的?id。 当?Post?模型有一个关联的属性名(译者注:?Post?模型中用?hasOne?定义?getAuthor()?函数) 叫?author?并且作者模型(译者注:本例的作者模型是?users?)有一个属性叫?name,那么你可以通过在 yii\grid\GridView::$columns 中定义属性名为author.name?来处理。这时的网格视图能显示作者名了,但是默认是不支持按作者名排序和过滤的。 你需要调整上个章节介绍的PostSearch?模型,以添加此功能。为了使关联列能够排序,你需要连接关系表,以及添加排序规则到数据提供者的排序组件中:$query = Post::find();$dataProvider = new ActiveDataProvider([ 'query' => $query,]);// 连接与 `users` 表相关联的 `author` 表// 并将 `users` 表的别名设为 `author`$query->joinWith(['author' => function($query) { $query->from(['author' => 'users']); }]);// 使得关联字段可以排序$dataProvider->sort->attributes['author.name'] = [ 'asc' => ['author.name' => SORT_ASC], 'desc' => ['author.name' => SORT_DESC],];// ...过滤也需要像上面一样调用joinWith方法。你也需要在属性和规则中定义该列,就像下面这样:public function attributes(){ // 添加关联字段到可搜索属性集合 return array_merge(parent::attributes(), ['author.name']);}public function rules(){ return [ [['id'], 'integer'], [['title', 'creation_date', 'author.name'], 'safe'], ];}然后在?search()?方法中,你仅需要添加一个额外过滤条件:$query->andFilterWhere(['LIKE', 'author.name', $this->getAttribute('author.name')]);信息:在上面的代码中,我们使用相同的字符串作为关联名称和表别名; 然而,当你的表别名和关联名称不相同的时候,你得注意在哪使用你的别名,在哪使用你的关联名称。 一个简单的规则是在每个构建数据库查询的地方使用别名,而在所有其他和定义相关的诸如:attributes()?和?rules()?等地方使用关联名称。例如,你使用?au?作为作者关系表的别名,那么联查语句就要写成像下面这样:$query->joinWith(['author' => function($query) { $query->from(['au' => 'users']); }]);当别名已经在关联函数中定义了时,也可以只调用?$query->joinWith(['author']);。在过滤条件中,别名必须使用,但属性名称保持不变:$query->andFilterWhere(['LIKE', 'au.name', $this->getAttribute('author.name')]);排序定义也同样如此:$dataProvider->sort->attributes['author.name'] = [ 'asc' => ['au.name' => SORT_ASC], 'desc' => ['au.name' => SORT_DESC],];同样,当指定使用 yii\data\Sort::defaultOrder 来排序的时候,你需要使用关联名称替代别名:$dataProvider->sort->defaultOrder = ['author.name' => SORT_ASC];信息:更多关于?joinWith?和在后台执行查询的相关信息, 可以查看?active record docs on joining with relations。SQL视图用于过滤、排序和显示数据还有另外一种方法可以更快、更有用 - SQL 视图。例如,我们要在?GridView?中显示用户和他们的简介,可以这样创建 SQL 视图:CREATE OR REPLACE VIEW vw_user_info AS SELECT user.*, user_profile.lastname, user_profile.firstname FROM user, user_profile WHERE user.id = user_profile.user_id然后你需要创建活动记录模型来代表这个视图:namespace app\models\views\grid;use yii\db\ActiveRecord;class UserView extends ActiveRecord{ /** * @inheritdoc */ public static function tableName() { return 'vw_user_info'; } public static function primaryKey() { return ['id']; } /** * @inheritdoc */ public function rules() { return [ // 在这定义你的规则 ]; } /** * @inheritdoc */ public static function attributeLabels() { return [ // 在这定义你的属性标签 ]; }}之后你可以使用这个 UserView 活动记录和搜索模型,无需附加的排序和过滤属性的规则。 所有属性都可开箱即用。请注意,这种方法有利有弊:你不需要指定不同排序和过滤条件,一切都包装好了;它可以更快,因为数据的大小,SQL查询的执行(对于每个关联数据你都不需要额外的查询)都得到优化;因为在SQL视图中这仅仅是一个简单的映射UI,所以在你的实体中,它可能缺乏某方面的逻辑,所以,假如你有一些诸如isActive、isDeleted?或者其他影响到UI的方法, 你也需要在这个类中复制他们。单个页面多个网格视图部件你可以在一个单独页面中使用多个网格视图,但是一些额外的配置是必须的,为的就是它们相互之间不干扰。 当使用多个网格视图实例的时候,你必须要为生成的排序和分页对象配置不同的参数名,以便于每个网格视图有它们各自独立的排序和分页。 你可以通过设置 yii\data\Sort::sortParam 和 yii\data\Pagination::pageParam,对应于数据提供者的 yii\data\BaseDataProvider::$sort 和 yii\data\BaseDataProvider::$pagination 实例。假如我们想要同时显示?Post?和?User?模型,这两个模型已经在?$userProvider?和?$postProvider?这两个数据提供者中准备好, 具体做法如下:use yii\grid\GridView;$userProvider->pagination->pageParam = 'user-page';$userProvider->sort->sortParam = 'user-sort';$postProvider->pagination->pageParam = 'post-page';$postProvider->sort->sortParam = 'post-sort';echo '<h1>Users</h1>';echo GridView::widget([ 'dataProvider' => $userProvider,]);echo '<h1>Posts</h1>';echo GridView::widget([ 'dataProvider' => $postProvider,]);Using GridView with Pjax注意: 这部分正在开发中。待定

上一页  [1] [2] [3] 


数据小部件(Data Widgets)