Yii2实现跨mysql数据库关联查询排序功能
遇到一个项目,需要跨表网上找了很多的资料,整理一下,方便以后再次使用
背景:在一个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数据库关联查询排序功能的更多相关文章
- MySql数据库慢查询
一.什么是数据库慢查询? 数据库慢查询,就是查询时间超过了我们设定的时间的语句. 可以查看设定的时间: 默认的设定时间是10秒.也可以自己根据实际项目设定. set long_query_time=0 ...
- Mysql数据库使用量查询及授权
Mysql数据库使用量查询及授权 使用量查询 查看实例下每个库的大小 select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2 ...
- Mysql 单表查询-排序-分页-group by初识
Mysql 单表查询-排序-分页-group by初识 对于select 来说, 分组聚合(((group by; aggregation), 排序 (order by** ), 分页查询 (limi ...
- MySQL查询优化:连接查询排序limit
MySQL查询优化:连接查询排序limit(join.order by.limit语句) 2013-02-27 个评论 收藏 我要投稿 MySQL查询优化:连接查询排序 ...
- mysql(一) 关联查询的方式
mysql做关联查询时,一般使用join....on.....的语法. 但还有其它两种语法形式,三者的主要区别在于书写形式,其余方面并无太多差异. 如下三种形式: select * from trad ...
- MySQL数据库的查询缓冲机制
MySQL数据库的查询缓冲机制 2011-08-10 11:07 佚名 火魔网 字号:T | T 使用查询缓冲机制,可以极大地提高MySQL数据库查询的效率,节省查询所用的时间.那么查询缓冲机制是怎样 ...
- MySQL 查询优化 - 关联查询
1. 关联查询执行流程 MySQL执行关联查询的策略很简单,他会从一个表中循环取出单条数据,然后用该条数据到下一个表中寻找匹配的行,然后回溯到上一个表,到所有的数据匹配完成为止.因此也被称为" ...
- MySQL数据库字符集和排序规则的四个级别
MySQL数据库字符集和排序规则有四个级别的默认设置:服务器,数据库,表和列. 最初,服务器字符集和排序规则取决于启动mysqld时使用的选项.可以使用 --character-set-server该 ...
- 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 ...
随机推荐
- SVN仓库连同版本信息迁移新服务器的步骤
SVN仓库连同版本信息迁移新服务器的步骤 步骤一:导出(1)链接原服务器,找到SVN Server安装路径下的bin文件,并复制文件路径,如 C:\Program File\SVN Server\bi ...
- $.ajax、$.post
jQuery.post( url, [data], [callback], [type] ) :使用POST方式来进行异步请求 参数: url (String) : 发送请求的URL地址. data ...
- css 引入方式以及css的选择器
一.css的引入方式: 1.行内样式 <div> <p style="color: red">我是一个段落</p> </div> 2 ...
- JSON FILE NOT FOUND?
(WIN7+IIS7) 搞一个小测试,一个小程序,用一个JSON文件来显示数据, 用HTML 访问是完全没有问题的,可是一放到IIS下,就出现无法访问, CONSOLE:提示 NOT FOUND 原 ...
- Debug get/set property
1. Select "Debug -> Windows -> Breakpoints" from VS menu. 2. Click "New -> B ...
- 夜色的 cocos2d-x 开发笔记 03
本章添加敌人,首先我们在.h文件里添加新的方法 之后进入.cpp文件,写出方法内容 当然还要调用一次,我把这个方法添加在了这里,也就是和发子弹是同步的,当然想要多久调用一次大家可以自己调整 运行一下 ...
- [原创]在Windows Server 2019上配置NAS
序言 此教程安装的都是最新版本的.由于是当NAS让它非常稳定的运行,所以能不安装的软件尽量不要安装. 一.准备工作 [更新系统] 没啥,就他喵想用个最新的. 右键点击开始键->设置->更新 ...
- 如何领域驱动设计?-实践感悟&总结分享
主要是在开发过程中,个人对于领域驱动设计的实践感悟和总结:也是对新进开发人员的培训资料:希望对关注DDD的童鞋有所帮助. 概述 领域驱动不是纯粹的技术问题,领域建模(建立数据表只是一部分)是领域专家( ...
- Azure进阶攻略 | 下载还是在浏览器直接打开,MIME说了算!
多年来,从一开始的网络菜鸟发展成 Azure 云专家,想必你一定学到了很多知识.不知道在这个过程中你自己是否遇到过,或者被人问到过类似下面这样的问题: 同样是直接点击网页上提供的 .mp4 视频文件链 ...
- Sleep 和 Wait 关于锁释放的区别
sleep和wait的区别是一个老生常谈的问题.Sleep 是 Thread类的方法, wait是Object类的方法.但是关键的区别是对锁的操作问题. 当我们调用sleep的时候,线程进入休眠,但是 ...