thinkphp多表查询

在学习thinkphp 的过程中,需要对多表进行操作,但是在实际过程中,总是遇到各种问题,所以写下这篇博文,作为自己的学习历程
 
在操作过程中,两表查询都没有问题,但是三表查询就开始出现问题
 
有以下三张表,分表为pl表(uid,content),user表(id,username),lyb表(uid,title)
 
多表查询操作有以下几种方法:
 
㈠视图模型(推荐)
 
定义视图模型,只需要继承Think\Model\ViewModel,然后设置viewFields属性即可
 
复制代码
public $viewFields = array(
        'pl'        =>array('uid','rid','content'),
        'user'        =>array('id','username','_on'=>'pl.uid=user.id'),
        'lyb'       =>array('uid'=>'lid','content'=>'lyb_content','title','_on'=>'pl.uid=lyb.uid'), //如果表中有字段重名,可以通过=>设置别名,'uid'=>'lid'
        );     
复制代码
视图查询:
 
视图查询和不同模型的查询一样,没有什么区别。
 
 $Model = D("pl") ->field('uid,title,username,lyb_content')->select();   //pl为数据库名
如果发现查询的结果存在重复数据,还可以使用group方法来处理。
 
㈡join
 
JOIN方法也是连贯操作方法之一,用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
 
join通常有下面几种类型,不同类型的join操作会影响返回的数据结果。
 
INNER JOIN: 如果表中有至少一个匹配,则返回行,等同于 JOIN
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN: 只要其中一个表中存在匹配,就返回行
join方法可以支持以上四种类型:
 
同样是对以上三张表进行操作
 
$Model = D("pl")
          ->join('lyb on pl.uid = lyb.uid')
          ->join('user on pl.uid = user.id') 
          ->field('user.username,lyb.title,pl.content')
          ->select();
 
 
㈢table
 
table方法也属于模型类的连贯操作方法之一,主要用于指定操作的数据表。
 
用法
一般情况下,操作模型的时候系统能够自动识别当前对应的数据表,所以,使用table方法的情况通常是为了:
 
切换操作的数据表;
对多表进行操作;                                                                                                                                                                                          
$Model = D("pl")
  ->field('pl.content,user.username,lyb.title')
  ->table('pl,lyb,user')
  ->limit(10)
  ->select();
注:table方法默认查询的是所有字段的值

时间: 2024-09-19 08:54:06

thinkphp多表查询的相关文章

thinkphp多表查询两表有重复相同字段的完美解决方法_php技巧

框架:thinkphp 版本:3.2.3 内容:查询语句 解决问题:重复字段问题 $Data = M('a')->where($where) ->Field('a.name as aname,b.name as uname,a.*') ->join('b on b.jb_id=a.id') ->order('a.id desc') ->select(); 解释:a.* 查询a表所有的字段 a.name as aname 转换a表中的name重复字段为aname 以上就是小编为

Thinkphp连表查询及数据导出方法示例_php实例

本文实例讲述了Thinkphp连表查询及数据导出的方法.分享给大家供大家参考,具体如下: 这今天实验室的招新工作就要展开了,我们通过实验室网站关联到杭电OJ,大一的新生将他们杭电的用户名在实验室网站提交,网站就会通过网络爬虫到杭电OJ上面进行数据抓取存到实验室数据库. 现在我要做的事就是把新生表和新生OJ数据表联合导出.实验室网站是用thinkphp框架开发的.所以根据以前的工作经验.问题很快就解决了. 现在跟大家分享一下. thinkphp的扩张类都是放在ORG目录下面,在通过import()

thinkPHP多表查询及分页功能实现方法示例

本文实例讲述了thinkPHP多表查询及分页功能实现方法.分享给大家供大家参考,具体如下: 项目业务逻辑为:教师上传试卷,设置答题卡,发布答题卡给相关的班级或群组,只有试卷关联的答题卡发布后,该试卷才能在系统试卷中搜索到,同时其他的老师也可以收藏.在前端的收藏模块中,有个业务是给个input框以提供搜索功能给用户,但是在事先设计的搜索表中,只有一处试卷ID是和试卷表关联的,如果用户搜索试卷题目那岂不要两表查询了,一开始我想到的方法是在收藏表中多加个字段,也就是把试卷题目的字段添加到收藏表中,业务

Thinkphp连表查询及数据导出方法示例

本文实例讲述了Thinkphp连表查询及数据导出的方法.分享给大家供大家参考,具体如下: 这今天实验室的招新工作就要展开了,我们通过实验室网站关联到杭电OJ,大一的新生将他们杭电的用户名在实验室网站提交,网站就会通过网络爬虫到杭电OJ上面进行数据抓取存到实验室数据库. 现在我要做的事就是把新生表和新生OJ数据表联合导出.实验室网站是用thinkphp框架开发的.所以根据以前的工作经验.问题很快就解决了. 现在跟大家分享一下. thinkphp的扩张类都是放在ORG目录下面,在通过import()

thinkphp学习笔记之多表查询_php实例

在操作过程中,两表查询都没有问题,但是三表查询就开始出现问题 有以下三张表,分表为pl表(uid,content),user表(id,username),lyb表(uid,title) 多表查询操作有以下几种方法: ㈠视图模型(推荐) 定义视图模型,只需要继承Think\Model\ViewModel,然后设置viewFields属性即可 public $viewFields = array( 'pl' =>array('uid','rid','content'), 'user' =>arra

thinkphp中多表查询中防止数据重复的sql语句(必看)_php技巧

下面先来看看例子: table id name 1 a 2 b 3 c 4 c 5 b 库结构大概这样,这只是一个简单的例子,实际情况会复杂得多. select *, count(distinct name) from table group by name 结果: id name count(distinct name) 1 a 1 2 b 1 3 c 1 最后一 项是多余的,不用管就行了 tp2.0手册   搜索连贯操作 可看到相关的资料 SELECT cat_id, COUNT(*) AS

ThinkPHP多表联合查询的常用方法_php实例

ThinkPHP中关联查询(即多表联合查询)可以使用 table() 方法或和join方法,具体使用如下例所示: 1.原生查询示例: 复制代码 代码如下: $Model = new Model(); $sql = 'select a.id,a.title,b.content from think_test1 as a, think_test2 as b where a.id=b.id '.$map.' order by a.id '.$sort.' limit '.$p->firstRow.',

thinkPHP的表达式查询用法详解_php实例

本文实例讲述了thinkPHP的表达式查询.分享给大家供大家参考,具体如下: ThinkPHP 表达式 这里说的表达式,是指 ThinkPHP 框架中特有的表达式.这些表达式用于查询或更新删除等操作的 where条件 及模板标签中. Where 条件中使用表达式 Where 条件表达式格式为: $map['字段名']  = array('表达式', '操作条件'); 其中 $map 是一个普通的数组变量,可以根据自己需求而命名.上述格式中的表达式实际是运算符的意义: TP运算符 SQL运算符 例

ThinkPHP中关联查询实例_php实例

本文实例讲述了ThinkPHP中关联查询的用法.分享给大家供大家参考.具体分析如下: 在THINKPHP中关联查询(多表查询)可以使用 table() 方法或和join方法,如下示例所示: 1.table() 复制代码 代码如下: $list = $user->table('user_status stats, user_profile profile')->where('stats.id = profile.typeid')->field('stats.id as id, stats.