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

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

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

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

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

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

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

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

  1. <?= GridView::widget([
  2. 'dataProvider' => $dataProvider,
  3. 'columns' => [
  4.  
  5. //其他列
  6.  
  7. [
  8. 'label' => '统计数据',
  9. 'value' => function($model){
  10. return isset($model->stat->data) ? $model->stat->data : null;
  11. }
  12. ],
  13.  
  14. //其他列
  15. ],
  16. ]); ?>

  或者这样

  1. <?= GridView::widget([
  2. 'dataProvider' => $dataProvider,
  3. // 'filterModel' => $searchModel,
  4. 'columns' => [
  5. // ['class' => 'yii\grid\SerialColumn'],
  6. [
  7.  
  8. 'label' => '数据统计',
  9.               'attrube'=>'data' //输入对应的  
  10. 'value' => 'stat.data'
  11.  
  12. ],
  13.  
  14. ['class' => 'yii\grid\ActionColumn'],
  15. ],
  16. ]); ?>

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

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

  • UserSearch:

  1. public $data;
  2. public function rules()
  3. {/*{{{*/
  4. return [
  5. ['data'], 'integer'],
  6. //其他列
  7. ];
  8. }/*}}}*/
  9.  
  10. public function search($params, $onlyActiveUsers = false)
  11. {
  12. $query = User::find();
  13. $query->joinWith(['stat']);
  14.  
  15. $dataProvider = new ActiveDataProvider([
  16. 'query' => $query,
  17. 'sort' => [
  18. 'attributes' => [
  19. //其他列
  20.  
  21. 'data' => [
  22. 'asc' => [UserStat::tableName() . '.data' => SORT_ASC],
  23. 'desc' => [UserStat::tableName() . '.data' => SORT_DESC],
  24. ],
  25.  
  26. //其他列
  27. ],
  28. 'defaultOrder' => [
  29. 'id' => SORT_DESC,
  30. ],
  31. ],
  32. 'pagination' => [
  33. 'pageSize' => 50,
  34. ],
  35. ]);
  36.  
  37. $this->load($params);
  38.  
  39. if (!$this->validate()) {
  40. $query->where('0=1');
  41. return $dataProvider;
  42. }
  43.  
  44. $query->filterWhere([
  45.  
  46. //其他列
  47.  
  48. UserStat::tableName() . '.data' => $this->data
  49. ]);
  50.  
  51. return $dataProvider;
  52. }

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

  1. <?php $form = ActiveForm::begin(); ?>
  2. //其他列
  3.  
  4. <?= $form->field($model, 'data')?>
  5.  
  6. //其他列
  7. <div class="form-group">
  8. <?= Html::submitButton('Search', ['class' => 'btn btn-primary']) ?>
  9. </div>
  10.  
  11. <?php ActiveForm::end(); ?>

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

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

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

转载: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. SVN仓库连同版本信息迁移新服务器的步骤

    SVN仓库连同版本信息迁移新服务器的步骤 步骤一:导出(1)链接原服务器,找到SVN Server安装路径下的bin文件,并复制文件路径,如 C:\Program File\SVN Server\bi ...

  2. $.ajax、$.post

    jQuery.post( url, [data], [callback], [type] ) :使用POST方式来进行异步请求 参数: url (String) : 发送请求的URL地址. data ...

  3. css 引入方式以及css的选择器

    一.css的引入方式: 1.行内样式 <div> <p style="color: red">我是一个段落</p> </div> 2 ...

  4. JSON FILE NOT FOUND?

    (WIN7+IIS7) 搞一个小测试,一个小程序,用一个JSON文件来显示数据, 用HTML 访问是完全没有问题的,可是一放到IIS下,就出现无法访问, CONSOLE:提示  NOT FOUND 原 ...

  5. Debug get/set property

    1. Select "Debug -> Windows -> Breakpoints" from VS menu. 2. Click "New -> B ...

  6. 夜色的 cocos2d-x 开发笔记 03

    本章添加敌人,首先我们在.h文件里添加新的方法 之后进入.cpp文件,写出方法内容 当然还要调用一次,我把这个方法添加在了这里,也就是和发子弹是同步的,当然想要多久调用一次大家可以自己调整 运行一下 ...

  7. [原创]在Windows Server 2019上配置NAS

    序言 此教程安装的都是最新版本的.由于是当NAS让它非常稳定的运行,所以能不安装的软件尽量不要安装. 一.准备工作 [更新系统] 没啥,就他喵想用个最新的. 右键点击开始键->设置->更新 ...

  8. 如何领域驱动设计?-实践感悟&总结分享

    主要是在开发过程中,个人对于领域驱动设计的实践感悟和总结:也是对新进开发人员的培训资料:希望对关注DDD的童鞋有所帮助. 概述 领域驱动不是纯粹的技术问题,领域建模(建立数据表只是一部分)是领域专家( ...

  9. Azure进阶攻略 | 下载还是在浏览器直接打开,MIME说了算!

    多年来,从一开始的网络菜鸟发展成 Azure 云专家,想必你一定学到了很多知识.不知道在这个过程中你自己是否遇到过,或者被人问到过类似下面这样的问题: 同样是直接点击网页上提供的 .mp4 视频文件链 ...

  10. Sleep 和 Wait 关于锁释放的区别

    sleep和wait的区别是一个老生常谈的问题.Sleep 是 Thread类的方法, wait是Object类的方法.但是关键的区别是对锁的操作问题. 当我们调用sleep的时候,线程进入休眠,但是 ...