我们在《Jsnpp框架如何查询数据库记录》一文里面介绍了单记录查询,多记录查询,以及分页查询,在介绍这些内容的时候,都是以单表查询为例子的。实际的开发工作中,我们经常会对多个表格进行联合查询,这一篇我们就来介绍怎么实现多表查询。
我们先来看一个多表查询的例子:
$this->app->db->table('posts')->field('id,title,summary')->where('status', 1)->order('id DESC')->join('uid = id')->table('users')->field('username')->paging(10)->box('posts')->endJoin()->finish();
上面的代码比我们之前学习过的单表查询复杂一些,也是一个全链的语法,“$this->app”表示应用的开始,“->finish()”表示全链的结束。中间的从“->db”到“->endJoin()”是数据库的多表查询语句,这里是两个表的联合查询,一个是“posts”表,另一个是“users”表。中间的“->join('uid = id')”是两个表的联合条件,条件是前面一个表“posts”的“uid”字段跟后面一个表“users”的“id”字段相等。并且用“->order('id DESC')”表示查询的结果是以“posts”表的“id”字段降序排列。其他的例如“field”、“where”等我们在单表查询里面已经学习过,其作用都是一样的。
这里要注意的是,数据库语句的最后有一个“->endJoin()”,这表示多表连接查询结束了。“->endJoin()”在多表连接查询中是必不可少的,必须要以此为结束。
由于以上代码里面有“->paging(10)”,所以也是一个分页查询,并且查询后的结果集放入盒子“posts”,我们后续可以从这个盒子里面取出具体的查询结果数据。
“->join('uid = id')”里面的联合条件,默认等号前面的是对应前面一个表,等号后面的是对应其后面的那个表。我们也可以用另外的一种写法来指定是哪个表,看下面的代码:
$this->app->db->table('posts')->alias('p')->field('id,title,summary')->where('status', 1)->order('id DESC')->join('p.uid = u.id')->table('users')->alias('u')->field('username')->paging(10)->box('posts')->endJoin()->finish();
在上面的代码中,我们分别用“->alias('p')”和“->alias('u')”给两个表取了一个别名,然后在join里面可以这么写“->join('p.uid = u.id')”。
上面是两表查询,如果是三表查询,那么是一样的,只需要再添加一个“join”链就可以了。
您还可以使用左连接“leftJoin”和右连接“rightJoin”,使用方法是替换“join”就可以了,例如下面的代码:
$this->app->db->table('posts')->field('id,title,summary')->where('status', 1)->order('id DESC')->leftJoin('uid = id')->table('users')->field('username')->paging(10)->box('posts')->endJoin()->finish();
我们可以观察并比较一下,实际上您需要做的工作仅仅是把“join”替换成“leftJoin”就可以了。“rightJoin”的使用方法也一样。
Jsnpp框架的数据库操作是不是很简单,一学就会。