• 欢迎访问IT乐园(o゚▽゚)o
  • 推荐使用最新版火狐浏览器和Chrome浏览器访问本网站。

yii2 ActiveRecord 多表关联以及多表关联搜索的实现

php fhy 6个月前 (12-05) 229次浏览 0个评论 扫描二维码

场景需求:

假设我们有一张用户表 user 和一张用户渠道表 auth,两张数据表通过 user.id 和 auth.uid 进行一对一关联。现需要在 user 列表展示 auth 表的来源渠道 source,且该渠道可搜索。

首先我们先通过 gii 生成 user 和 auth 系列相关的 mode l 和操作。此处不做详细说明。

我看继续看重要的几个操作步骤:

1、找到 user 表对应的 AR 模型类 common\models\User.php,在该类文件中进行关联 auth 表

设置好了之后,并不代表两张数据表自动进行关联了!我们访问 user 列表页(该列表页采用 gii 生成,目前我们没操作过),通过 debug 查看 Database Queries 不难发现,实际中的 query 并没有进行关联 auth 表

2、在 gridview 中添加关联表的来源渠道字段 source

有同学感觉疑问了,上面不是说了没进行关联吗,这个怎么可以直接使用 auth.source?

先别急,此时我们打开 debug 看看实际的 query。

我们会发现有很多类似 select * from auth where uid = xxx; 之类的操作,如果你的分页默认 20 条数据时,会有 20 个类似的 query。

我们先搞明白发生了什么?

实际上这属于 php 的基础知识了。读取和写入对象的一个不存在的成员变量时, __get() __set() 魔术函数会被自动调用。yii 也是利用了这一点对其进行了实现!

该操作跟大部分人在 gridview 中封装方法获取关联表数据几乎一致,但是!20 条 sql 的查询明显增加了众多的开销。如果这里是 left join 操作多好!

3、优化 sql

我们需要优化的是:

20 条 sql 变 1 条 sql

只获取关联表需要的字段

有同学要嚷嚷了,这里是 yii 自带的操作,怎么优化?我们回到数据源的获取上,发现 user 列表的数据是通过 userSearch mode l 的 search() 方法提供的。

也就是说我们的数据查询实际上就没有去进行关联表查询!既然如此,我们就在 UserSearch 加上关联查询

我们再来刷新下 user 列表页,然后通过 debug 分析发现有两条 sql 引起了我们的注意

也就是说我么已经达到了优化 sql 的目的,通过 debug 分析发现,DB 的查询时间少了很多。

4、关联表字段增加查询

gridview 中的搜索模型也是通过 searchModel 实现的,该模型通过 rules 控制着哪个字段可搜索,哪个字段不可搜索。

我们现在需要增加关联表的 source 可搜索,因此我们在 searchModel 中定义一个属性 source 且添加到 rules 中

接着我们把 gridview 中的 auth.source 修改一下

到这里我们界面上是 ok 的,要实现程序上的搜索还差一步,我们在数据源获取的地方加上新增的 source 条件即可

 

转载自: http://www.manks.top/yii2-many-ar-relation_search.html


IT 乐园 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:yii2 ActiveRecord 多表关联以及多表关联搜索的实现
喜欢 (0)
关于作者:
九零后挨踢男
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址