遇到一个项目,需要跨表网上找了很多的资料,整理一下,方便以后再次使用

背景:在一个mysql服务器上(注意:两个数据库必须在同一个mysql服务器上)有两个数据库:

memory (存储常规数据表) 中有一个 user 表(记录用户信息)

memory_stat (存储统计数据表) 中有一个 user_stat (记录用户统计数据)

现在在 user 表生成的 GridView 列表中展示 user_stat 中的统计数据

  • 只需要在User的model类中添加关联. 

public function getStat()
{
return $this->hasOne(UserStat::className(), ['user_id' => 'id']);
}

在GridView就可以这样使用来展示统计数据

<?= GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [ //其他列 [
'label' => '统计数据',
'value' => function($model){
return isset($model->stat->data) ? $model->stat->data : null;
}
], //其他列
],
]); ?>

  或者这样

<?= GridView::widget([
'dataProvider' => $dataProvider,
// 'filterModel' => $searchModel,
'columns' => [
// ['class' => 'yii\grid\SerialColumn'],
[ 'label' => '数据统计',
              'attrube'=>'data' //输入对应的  
'value' => 'stat.data' ], ['class' => 'yii\grid\ActionColumn'],
],
]); ?>

现在增加了一个需求,需要在user GridView 列表中对统计数据进行排序和筛选

若 user 和 user_stat 表在同一个数据库下我们可以这样做:

  • UserSearch:

public $data;
public function rules()
{/*{{{*/
return [
['data'], 'integer'],
//其他列
];
}/*}}}*/ public function search($params, $onlyActiveUsers = false)
{
$query = User::find();
$query->joinWith(['stat']); $dataProvider = new ActiveDataProvider([
'query' => $query,
'sort' => [
'attributes' => [
//其他列 'data' => [
'asc' => [UserStat::tableName() . '.data' => SORT_ASC],
'desc' => [UserStat::tableName() . '.data' => SORT_DESC],
], //其他列
],
'defaultOrder' => [
'id' => SORT_DESC,
],
],
'pagination' => [
'pageSize' => 50,
],
]); $this->load($params); if (!$this->validate()) {
$query->where('0=1');
return $dataProvider;
} $query->filterWhere([ //其他列 UserStat::tableName() . '.data' => $this->data
]); return $dataProvider;
}

search 表单中添加以下列就可以筛选了

<?php $form = ActiveForm::begin(); ?>
//其他列 <?= $form->field($model, 'data')?> //其他列
<div class="form-group">
<?= Html::submitButton('Search', ['class' => 'btn btn-primary']) ?>
</div> <?php ActiveForm::end(); ?>

那么,如何来解决这个问题呢?

  • 其实很简单,只需要重写 user_stat 的 model 类下的 tableName() 方法就可以了。

// 默认是这样的
public static function tableName()
{
return 'user_stat';
} public static function getDb()
{
return Yii::$app->get('dbStat');
}
// 只需要在表明前添加数据库名
public static function tableName()
{
return 'memory_stat.user_stat';
} public static function getDb()
{
return Yii::$app->get('dbStat');
}

转载:https://segmentfault.com/a/1190000008107267

侵删!!!

Yii2实现跨mysql数据库关联查询排序功能的更多相关文章

  1. MySql数据库慢查询

    一.什么是数据库慢查询? 数据库慢查询,就是查询时间超过了我们设定的时间的语句. 可以查看设定的时间: 默认的设定时间是10秒.也可以自己根据实际项目设定. set long_query_time=0 ...

  2. Mysql数据库使用量查询及授权

    Mysql数据库使用量查询及授权 使用量查询 查看实例下每个库的大小 select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2 ...

  3. Mysql 单表查询-排序-分页-group by初识

    Mysql 单表查询-排序-分页-group by初识 对于select 来说, 分组聚合(((group by; aggregation), 排序 (order by** ), 分页查询 (limi ...

  4. MySQL查询优化:连接查询排序limit

    MySQL查询优化:连接查询排序limit(join.order by.limit语句) 2013-02-27      个评论       收藏    我要投稿   MySQL查询优化:连接查询排序 ...

  5. mysql(一) 关联查询的方式

    mysql做关联查询时,一般使用join....on.....的语法. 但还有其它两种语法形式,三者的主要区别在于书写形式,其余方面并无太多差异. 如下三种形式: select * from trad ...

  6. MySQL数据库的查询缓冲机制

    MySQL数据库的查询缓冲机制 2011-08-10 11:07 佚名 火魔网 字号:T | T 使用查询缓冲机制,可以极大地提高MySQL数据库查询的效率,节省查询所用的时间.那么查询缓冲机制是怎样 ...

  7. MySQL 查询优化 - 关联查询

    1. 关联查询执行流程 MySQL执行关联查询的策略很简单,他会从一个表中循环取出单条数据,然后用该条数据到下一个表中寻找匹配的行,然后回溯到上一个表,到所有的数据匹配完成为止.因此也被称为" ...

  8. MySQL数据库字符集和排序规则的四个级别

    MySQL数据库字符集和排序规则有四个级别的默认设置:服务器,数据库,表和列. 最初,服务器字符集和排序规则取决于启动mysqld时使用的选项.可以使用 --character-set-server该 ...

  9. Python学习笔记_02:使用Tkinter连接MySQL数据库实现登陆注册功能

    1 环境搭建 1.1 Python安装 1.2 MySQL环境搭建 1.3安装MySQLdb  2 具体实现 2.1 登陆界面 2.2 注册界面 2.3 具体实现部分代码   1 环境搭建 1.1 P ...

随机推荐

  1. php7.0.24-nts配置步骤

    php-cgi.exe文件运行 php-cgi.exe -b 127.0.0.1:9000 -c D:/myphp2017/php7-nts/php.ini nginx命令 启动 start ngin ...

  2. subclipse解决JavaHL不可用的问题

    最近在配置eclipse的svn插件,发现在部分机器上无法启用javaHL,很是奇怪,尤其是在windows环境下,网上搜索到的解决方案太复杂,居然还有说要安装slikSVN的,其实windows只需 ...

  3. SpringBoot系列之——整合JPA、mysql

    一.JPA      1. 概念:JPA顾名思义就是Java Persistence API的意思,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. 2. ...

  4. java基础:JDK环境安装

    根据操作系统位数(32/64,一般64位向下兼容),项目要求版本,下载对应JDK安装包 配置环境变量 JAVA_HOME C:\Program Files\Java\jdk1.7.0_80 PATH ...

  5. struts2分页实现

    1.定义一个page类,里面包括每一个的数量,当前页码,总记录数,等 2.将page对象传入dao中,dao输出分页查询好的数据.返回到action中,action放到request中,jsp从req ...

  6. flexpager权限控制文件crossdomain.xml

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE cross-domain-policy SY ...

  7. The fourteenth day

    A man is not old as long as he is seeking something. A man is not old until regrets take the place o ...

  8. <Android 基础(十六)> Toast

    介绍 A toast provides simple feedback about an operation in a small popup. It only fills the amount of ...

  9. <Android 基础(十)> FloatingActionButton

    介绍 Source Code中的介绍如下: Floating action buttons are used for a special type of promoted action. They a ...

  10. 关于基于Linphone的视频通话Android端开发过程中遇到的问题

    关于基于Linphone的视频通话Android端开发过程中遇到的问题 运用开源项目Linphone的SDK进行开发,由于是小组进行开发,我主要负责的是界面部分. 由于当时是初学Android开发,对 ...