ThinkPHP 经常会遇到多表查询,最近的一个项目就是要同时查询四个表,当然 sql 也要使用多表查询了,只是在 where 的时候有些困难,研究了大半天的时间,终于给搞出来了,好了,先看看 ThinkPHP 中关于 JOIN 多表查询的使用吧,其它查询部分一切照旧。
JOIN方法是连贯操作中唯一可以多次调用的方法
分别查询表artist、work、card 、card
JOIN 有两种方式:LEFT JOIN(默认使用)与RIGHT JOIN
- //Left Join
- $Model->join('work ON artist.id = work.artist_id')->join('card ON artist.card_id = card.id')->select();
- $Model->table('user U')->join('news N on U.id=N.cid')->field('U.*,N.*')->order('id desc')->limit('8')->select();
- //Left Join
- $Model->table('user U')->join('news N on U.id=N.cid')->field('U.*,N.*')->order('id desc')->limit('8')->select();
- //Right Join
- $Model->join('RIGHT JOIN work ON artist.id = work.artist_id')->select();
- //dxpang.com
- $Model->table('user U')->join(array('right','news N on U.id=N.cid'))->field('U.*,N.*')->order('id desc')->limit('8')->select();
在写好 JOIN 之后,在使用 where 的时候,要指定表名,例如 where 条件:
- //Left Join
- $Model->join('work ON artist.id = work.artist_id')->join('card ON artist.card_id = card.id')->wehre("artist.card_id =10")->select();
再来分享我写的一个 ThinkPHP 查询方法,可以当作正常的列表来使用,也可以直接 post 当作搜索来使用,代码如下:
- public function index(){
- $model = M('sequence_code');
- import("@.ORG.Page");
- $count = $model->count();
- $Page = new Page($count);
- if ($_POST[phone]){
- $where['xn_sequence_code.phone'] = array('like',"%".$_POST['phone']."%");
- }
- $this->list = $model->where($where)->field('xn_sequence_code.id,xn_sequence_code.scode,xn_sequence_code.phone,xn_sequence_code.is_use,xn_sequence_code.use_date,xn_demand.title,xn_insurance_deepconfig.gradename,xn_member.nickname')->join('left join xn_demand on xn_demand.id=xn_sequence_code.type_id left join xn_insurance_deepconfig on xn_insurance_deepconfig.id=xn_sequence_code.grade_id left join xn_member on xn_member.mobile=xn_sequence_code.phone')->limit($Page->firstRow. ',' . $Page->listRows)->order('xn_sequence_code.id desc')->select(); //dxpang.com
- $this->page=$Page->show();
- $this->display();
- }
重点在于 sql 语句的拼接和 where 条件语句,之前我使用的一直是不带表名的 where 语句,导致查询不成功,如果是只有两个表的查询,where 语句不带表前缀是可以的,如果是多表的话就不行,这里有个细微的区别,害得我搞了半天。