TP3.2后台部分功能写法总结(复合查询,数据范围内查询,前台筛选)

总结一下最近刚接触TP3框架的后台一些功能模块的写法,坑很多,所以记下来,总结和使用!

代码的相关注释会写在代码旁边


1.后台 类型字段的接收 和前台类型的列表搜索筛选

//这是后台控制器接收类型的值 , 如果存在,进行筛选  
//筛选的数据是$where
$type = I("request.type", '', 'trim,string,strip_tags,htmlspecialchars');
if ($type != "") {
$where['type'] = array('eq', $type);
}
$this->assign('type', $type);
//页面显示的筛选搜索  从后台接收的type 进行取值判断
//这是列表的值判断 如果从数据库中拿到的值是123 那么必须要赋予它中文的意思 所以配合上面搜索的那个地方 做出对应的switch


收款
下发
冻结


从后台读取数据,并进行三目判断


查表的时候,问题出现在提取字段的‘field’这边的坑,以往是一个字段一堆引号装起来,但是TP是一对引号,有多个字段,并且对应的表的字段,先是用.隔开,在用,隔开,注意看,细节!

//join和where查询
$pay_info = M('order')
->join('pay_channel_account ON pay_order.account_id = pay_channel_account.id' )
->where('pay_order.pay_orderid='.$orderid)
->field('pay_order.pay_orderid,pay_amount,pay_tongdao,out_trade_id,pay_channel_account.mch_id')
->select();

多字段模糊查询

//这是后台的多字段的写法,把多个字段存放到一个变量内,只要从前台接收到的值符合这些字段,就可以进行筛选
$keyword = I("request.keyword", '', 'trim,string,strip_tags,htmlspecialchars');
if ($keyword ) {
$where['bankfullname|banknumber'] = array('like', '%' . $keyword . '%');
}
$this->assign("keyword", $keyword);//下发信息查询
//name的值就是后台定义的 value也是从后台拿到 如此这般就可以进行搜索筛选

左连接写法

$list = M('banks')
->where($where)
->join('pay_bank_amount_logs ON pay_banks.id = pay_bank_amount_logs.bank_id')
->join('pay_order ON pay_bank_amount_logs.orderid = pay_order.pay_orderid')
->join('left join pay_tklist ON pay_bank_amount_logs.tk_id = pay_tklist.id')
->where(['pay_banks.id' => $id])
->limit($page->firstRow . ',' . $page->listRows)
->order('pay_bank_amount_logs.id desc')
->select();

打印出一段查询转换成原生的MySQL

dump(M('order')->where($totalMap)->fetchSql()->count());

时间范围内的筛选

--今日

$beginToday = mktime(0, 0, 0, date('m'), date('d'), date('Y'));//一天的 开始
$endToday = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1;//一天的结束
$map['remark_time'] = array(array('EGT', $beginToday), array('ELT', $endToday));//对应的字段在这个范围内

--本周

$week_start_time= mktime(0, 0 , 0,date("m"),date("d")-date("w")+1,date("Y"));//一周的开始
$week_end_time= mktime(0, 0 , 0,date("m"),date("d")-date("w")+7,date("Y"));//一周的结束
$map['remark_time'] = array(array('EGT', $week_start_time), array('ELT', $week_end_time));

--本月

$monthBegin = mktime(0,0,0,date('m'),1,date('Y'));//一个月的开始
$monthEnd = mktime(23,59,59,date('m'),date('t'),date('Y'));//一个月的结束
$map['remark_time'] = array(array('EGT', $monthBegin), array('ELT', $monthEnd));

复合查询

$price_min = I('request.price_min',"");//最近金额 防止有一个值为空 所以默认为空字符串
$price_max = I('request.price_max',"");//最高金额 防止有一个值为空 所以默认为空字符串
if($price_min>$price_max){
$this->error("最低金额不能大于最高金额!");
}elseif($price_min !=="" && $price_max !==""){ //
$price_min = $price_min+0;//转类型
$price_max = $price_max+0;//转类型
//三个字段的关系是 or 逻辑关系 其他是 and逻辑关系
//进行复合查询
// _LOGIC _COMPLEX
$where2['O.pay_amount'] = array(array('EGT',$price_min),array('ELT',$price_max));//交易金额
$where2['_logic'] = 'or';
$where['_complex'] = $where2;
}

 

你可能感兴趣的:(PHP,tp复合查询,TP搜索筛选)