THINKPHP_(2)_TP模型的多表关联查询和多表字段的关键字搜索。
问题:

上述内容中,标题和学年属于一个数据表。分类则属于另外一个数据表,并且是利用id关联后,另外一个数据表中的title字段。
需要设置关键字搜索,实现多表关联查询和多表字段的关键字搜索。
解决方法:
编写如下代码:
public function search($srcfrom)
{
// 整理变量
$src = [
'category' => ''
,'searchval' => ''
,'status' => ''
,'bfdate' => ''
,'enddate' => ''
];
$src = array_cover($srcfrom, $src) ;
if(isset($srcfrom['bfdate']) && strlen($srcfrom['bfdate']) > 0)
{
$src['bfdate'] = $srcfrom['bfdate'];
}else{
$src['bfdate'] = date("Y-m-d", strtotime("-6 year"));
}
if(isset($srcfrom['enddate']) && strlen($srcfrom['enddate']) > 0)
{
$src['enddate'] = $srcfrom['enddate'];
}else{
$src['enddate'] = date("Y-m-d", strtotime('4 year'));
} // 查询数据
$data = $this
->whereTime('bfdate|enddate', 'between', [$src['bfdate'], $src['enddate']])
// ->alias("c")
->withJoin(
// "glCategory"
[
'glCategory'=>function($query){
$query->field('id, title');
},
]
)
->when(strlen($src['searchval']) > 0, function($query) use($src){
$query->where("xueqi.title|glCategory.title|xuenian", 'like', '%' . $src['searchval'] . '%');
})
->when(strlen($src['category']) > 0, function($query) use($src){
$query->where('category', $src['category']);
})
->when(strlen($src['status']) > 0, function($query) use($src){
$query->where('status', $src['status']);
})
// ->with(
// [
// 'glCategory'=>function($query){
// $query->field('id, title');
// },
// ]
// )
->select(); file_put_contents('D:\log.txt',$this->getLastSql()); return $data;
}
在上述搜索中,我们利用withJoin进行关联。同时,利用
$query->where("xueqi.title|glCategory.title|xuenian", 'like', '%' . $src['searchval'] . '%');
这里的易错点:
当关联多表进行关键字搜索的时候,当前表和关联表都有title字段。我们在写sql语句的时候,会直接用title和glCategory.title进行区分。
但是在tp的世界里,必须注明模型xueqi.title(model的类名叫Xueqi,但是在where中,用首字母小写的xueqi即可)。
同时,对于没有多表重复的xuenian子弹,我们不需要注明xueqi。这也是sql和tp模型的一些不同之处。
THINKPHP_(2)_TP模型的多表关联查询和多表字段的关键字搜索。的更多相关文章
- THINKPHP_(4)_TP模型中with、withJoin和多层关联的深入分析
1.个人之前博文: TP模型的多表关联查询和多表字段的关键字搜索 TP6中实现多层关联,第一个表关联第二个表查询出的数据,再关联第三个表 2.withJoin的特性 2.1 第一个特性 在TP模型的多 ...
- 字节跳动基于ClickHouse优化实践之“多表关联查询”
更多技术交流.求职机会.试用福利,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 相信大家都对大名鼎鼎的ClickHouse有一定的了解了,它强大的数据分析性能让人印象深刻.但在字节大量 ...
- MSSQL N张表关联查询
declare @newTime varchar(50); declare @lasetTime varchar(50); set @newTime= getdate(); set @lasetTim ...
- RDIFramework.NET 中多表关联查询分页实例
RDIFramework.NET 中多表关联查询分页实例 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部署方案.该框架以SOA范式作为 ...
- 图解SQL多表关联查询
图解SQL多表关联查询 网上看了篇文章关于多表连接的,感觉很好,记录下来,以便日后自己学习 内连接 左连接 右连接 全外连接 1. 查两表关联列相等的数据 ...
- Oracle 数据库(oracle Database)Select 多表关联查询方式
Oracle数据库中Select语句语法及介绍 SELECT [ ALL | DISTINCT ] <字段表达式1[,<字段表达式2[,…] FROM <表名1>,<表名 ...
- ORACLE数据库多表关联查询效率问题解决方案
最近在做项目中遇到多表关联查询排序的效率问题(5张以上40W+数据的表),查询一次大概要20多秒,经过一番苦思冥想,处理方案如下: 1.软件设计初期,需要一对一关联的表应该设计在一张大表里,这样虽然字 ...
- mongodb操作之使用javaScript实现多表关联查询
一.数据控制 mongodb操作数据量控制,千万控制好,不要因为操作的数据量过多而导致失败. 演示一下发生此类错误的错误提示:
- ofbiz学习笔记01--多表关联查询
不管做什么项目,肯定会用到多表关联查询数据,从网络查询得知ofbiz有三种多表关联查询方法 实现一:Screem.xml 中的 section 里,加 <action>, 加 get-re ...
随机推荐
- 算法tip:栈的可生成性问题
算法tip:栈的可生成性问题 问题描述 给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,判断它们是否可以在最初空栈上进行推入 push 和弹出 pop 操作.(LeetCod ...
- 1.4.15- HTML标签之链接标签
代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- HDU 1430 关系映射 + 打表 .
题意是中文的不解释.(http://acm.hdu.edu.cn/showproblem.php?pid=1430) 思路: 这个题目直接BFS会超时的(我一开始超时了) ,如果 ...
- Linux文件共享服务之NFS
NFS(Network File System) 网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,本地NFS的客户端应用可 ...
- YII框架安装步骤(yii框架版本1.1.20,时间是2018/11)
0x01 首先中文官网下载https://www.yiichina.com/download 0x02 解压压缩包到www目录下(方便以后调试) 0x02-1 如果想看一下你的电脑是否能匹配yii框架 ...
- 【python】Leetcode每日一题-删除有序数组中的重复项
[python]Leetcode每日一题-删除有序数组中的重复项 [题目描述] 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现一次 ,返回删除后数组的新长度. 不要 ...
- FreeSql之Expression表达式拼接参数扩展
在FreeSql源码中Expression表达式拼接默认最多支持到5个泛型参数,当我们使用表关联比较多的时候,就需要进行扩展. 新建一个类,将命名空间改为System.Linq.Expressions ...
- MySQL分区表最佳实践
前言: 分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表.但是对于应用程序来讲,分区的表和没有分区的表是一样的.换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理 ...
- Java开发人员最容易出现的几类错误
一.把数组转成ArrayList List<String> list = Arrays.asList(arr); //以下带伪代码来自Arrays类中public static <T ...
- Vue | 指令实现自动翻译填充英文名功能
背景:应用系统中存在多个创建实体表单,表单填写时,在填写中文名称后,要填写对应的英文名作为标识或数据库查询索引. 需求:填写中文名的同时,系统自动生成英文名并填充到表单中,辅助用户操作,节约操作时间. ...