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; } ], //其他列 ], ]); ?>

现在增加了一个需求,需要在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; }

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

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

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 和 user_stat 表并在同一个数据库下。

于是就会报出这样一个错误:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'memory.user_stat' doesn't exist
The SQL being executed was: ...

要在两个数据库(同一台服务器)上进行关联数据查询,纯SQL语句如下:

复制代码 代码如下:
select a.*,b.* from memory.user as a,memory_stat.user_stat as b where a.id=b.user_id;

Yii2转化成 SQL 语句时默认不会在表明前添加数据库名,于是mysql在执行sql语句时就会默认此表在memory数据库下。

复制代码 代码如下:
select a.*,b.* from memory.user as a,memory.user_stat as b where a.id=b.user_id;

于是就出现了以上报错信息。

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

其实很简单,只需要重写 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'); } // 为了提高代码稳定性,可以这样写 public static function tableName() { preg_match("/dbname=([^;]+)/i", static::getDb()->dsn, $matches); return $matches[1].'.user_stat'; } public static function getDb() { return Yii::$app->get('dbStat'); }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-10-24 07:29:54

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

mysql数据库,自定义排序查询

问题描述 mysql数据库,自定义排序查询 select * from table 从table表中查询所有数据,按照 属性isable ==可用的排在前面, isable==不可用排在后面,该怎么实现? 解决方案 SELECT * FROM table WHERE isable = 1 ORDER BY isable ASC 或 SELECT * FROM table WHERE isable = 1 ORDER BY isable DESC 或 SELECT * FROM table WHE

Mysql数据库中子查询的使用_Mysql

废话不多说了直接个大家贴mysql数据库总子查询的使用. 代码如下所述 </pre><pre name="code" class="sql">1.子查询是指在另一个查询语句中的SELECT子句. 例句 SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2); 其中SELECT * FROM t1 ...称为Outer Query[外查询](或者Outer Statement), SE

数据库查询-数据库 关联查询 给予参数 两张表

问题描述 数据库 关联查询 给予参数 两张表 有表一 ID name 表二 ID address 1 123 1 2333 2 456 2 111233 3 3445 4 5667778 两张表通过 内连接 select * from 表1 inner join 表2 course on 表1.ID= 表2.ID 显示 共有的 ID name address 1 123 2333 2 456 111233 我现在我想通过表2的ID 1 查询 表1 的 name 值 sql 语句应该怎么写? 新手

mysql 语句关联查询问题

问题描述 mysql 语句关联查询问题 mysql 语句关联查询问题 mysql 语句关联查询问题mysql 语句关联查询问题 mysql 语句关联查询问题 mysql 语句关联查询问题 mysql 语句关联查询问题 mysql 语句关联查询问题 解决方案 MySQL的关联查询与子查询MySQL如何执行关联查询Hibernate查询关联对象是否为空的语句 解决方案二: SELECT T1.ID FROM T1 WHERE(T1.ID=(SELECT T2.ID FROM T2 WHERE T2.

java应用-oracle数据库和mysql数据库分页查询区别?

问题描述 oracle数据库和mysql数据库分页查询区别? oracle数据库和mysql数据库分页查询有什么区别?有何不同?具体,求教! 解决方案 oracle数据库分页用到rownum大小截取.mysql用limit.用法不一样 解决方案二: 语法上略有差别,但是大同小异,oracle借助行号函数来实现.http://blog.sina.com.cn/s/blog_8604ca230100vro9.html MySQL有limit函数http://qimo601.iteye.com/blo

java实现连接mysql数据库单元测试查询数据的实例代码_java

1.按照javaweb项目的要求逐步建立搭建起机构,具体的类包有:model .db.dao.test; 具体的架构详见下图: 2.根据搭建的项目架构新建数据库test和数据库表t_userinfo并且添加对应的测试数据; (这里我使用的是绿色版的数据库,具体的下载地址:http://pan.baidu.com/s/1mg88YAc) 具体的建立数据库操作详见下图: 开发实例"> 3.编写包中的各种类代码,具体参考代码如下: UserInfo.java /** * FileName: Us

mysql 数据库连查询类

mysql 数据库连查询类 class mysqlquery {  var $sql;//sql语句执行结果  var $query;//sql语句  var $num;//返回记录数  var $r;//返回数组  var $id;//返回数据库id号  //执行mysql_query()语句  function query($query)  {   $this->sql=mysql_query($query) or die(mysql_error ()."<br>"

MySQL查询优化:连接查询排序limit(join、order by、limit语句)

MySQL查询优化:连接查询排序limit(join.order by.limit语句) 不知道有没有人碰到过这样恶心的问题:两张表连接查询并limit,SQL效率很高, 但是加上order by以后,语句的执行时间变的巨长,效率巨低. www.bitsCN.com 情况是这么一个情况:现在有两张表,team表和people表,每个people属于一个 team,people中有个字段team_id. 下面给出建表语句: [sql] create table t_team ( id int pr

PHP结合Mysql数据库实现留言板功能_php实例

先给大家展示下留言板效果图: 最近看了下PHP基础语法,就想利用这些基本东西实现留言板,也是对基础知识的一个巩固. 什么是留言板?一种可以用来记录,展示文字信息的载体. 现切入正题,说说本次留言板是怎么实现! 首先用户提交留言后,相关内容存入服务器,当他想看的时候后台再把所有留言读出来,最后显示在浏览器上,用户就可以看到留言了. 这其中后台需要便于读写数据的一个工具,我选择mysql数据库来帮助我完成这些事. 我写了主要是三个php文件,分别是: conn.php 连接数据库: addmsg.p