关于phpcms 多表多字段自定义sql查询并分页功能,网上的教程比较多。
近期开发一个金属材料查询系统,需要在多个表单内查询keyword,还需要在用户表关联查询信息创建人的用户名,我实际应用了一下,测试成功。
我的代码整理如下:
1.修改phpcms\model\get_model.class.php,插入函数:public function multi_listinfo
//自定义分页查询{支持多表}
public function multi_listinfo($where = '', $page = 1, $pagesize = 12, $key='', $setpages = 10,$urlrule = '',$array = array()) {
$sql = preg_replace('/select([^from].*)from/i', "SELECT COUNT(*) as count FROM ", $where);
// echo $sql;
$this->sql_query($sql);
$c = $this->fetch_next();
$this->number = $c['count'];
$page = max(intval($page), 1);
$offset = $pagesize*($page-1);
$this->pages = pages($this->number, $page, $pagesize, $urlrule, $array, $setpages); //分页
$r = $this->sql_query($where.' LIMIT '.$offset.','.$pagesize);
while(($s = $this->fetch_next()) != false){
$data[] = $s;
}
return $data;
}
2.需要方法里面的代码,包含了sql的拼接,以及查询,分页实现。
//这里采用下面的多表联合查询
$where = " WHERE m.name like '%".$keyword."%'" ;
$where .= " OR trademark.name like '%".$keyword."%'" ;
//要查询用户名,这里用到了left join,从v9_mamber里面查询满足条件( m.createuser = u.userid)的用户名
$sql = "SELECT m.*,u.username FROM v9_material as m LEFT JOIN v9_material_trademark as trademark ON m.id = trademark.mid ";//
$sql .= " LEFT JOIN v9_member as u ON m.createuser = u.userid";//
$order = " order by m.id desc";
$sql= $sql.$where.$order;
//引入第一步修改的get_model.class.php文件
$get_db = pc_base::load_model('get_model');//在get_model.class里面定义的multi_listinfo方法
$page = intval($_GET['page'])?intval($_GET['page']) :'1';
$infos = $get_db->multi_listinfo($sql,$page,$pages = '5'); //返回查询结果
$pages = $get_db->pages;//返回分页
这里查询了3张表。主表为v9_material,LEFT JOIN了v9_material_trademark和v9_member两张表。
3.前端模板调用
{loop $infos $r}
<li>
<div class="list">
标题:{$r['name']},创建人:{$r['username']}
</div>
</li>
{/loop}
<!--分页-->
<div class="pages">{$pages}</div>
结束!