来拍法服api-pc

1.TP3.2方法

函数名称函数说明
A 函数实例化控制器
B 函数执行某个行为
C 函数用于读取配置信息
D 函数实例化模型
F 函数快速缓存设置和存取
G 函数调试统计
I 函数安全获取系统输入变量
L 函数设置和获取语言变量
M 函数实例化模型(无需定义模型类)
N 函数计数器
R 函数直接调用控制器的操作方法
S 函数缓存设置和存取
U 函数URL地址生成

(1)S()

// 缓存数据300秒
S('name',$value,300);
// 读取缓存
$value = S('name');
// 删除缓存
S('name',null);

(2)D()和M()

D就是实例化一个基于Model文件的Model。
M则是通过直接实例化Model方法(ThinkPHP基类)来动态的实例化一个Model对象,即使这个对应的Model文件不存在。

通俗一点说:
M实例化参数是数据库的表名。
D实例化的是你自己在Model文件夹下面建立的模型文件。

 

2.根据二维数组中的某个字段进行排序

(1)array_column() 返回输入数组中某个单一列的值。

(2)array_multisort() 函数返回排序数组。

(3)具体实现

<?php
$data = array(
  array(
    'id' => 5698,
    'first_name' => 'Bill',
    'last_name' => 'Gates',
  ),
  array(
    'id' => 4767,
    'first_name' => 'Steve',
    'last_name' => 'Aobs',
  ),
  array(
    'id' => 3809,
    'first_name' => 'Mark',
    'last_name' => 'Zuckerberg',
  )
);
//根据字段last_name对数组$data进行降序排列
$last_names = array_column($data,'last_name');
array_multisort($last_names,SORT_DESC,$data);

var_dump($data);
?>

可以对多个PHP数组进行排序,排序结果是所有的数组都按第一个数组的顺序进行排列,多个数组排序的键与第一个排列好的数组对应

其实说明白了就是,array_multisort()先把第一个数组按照键值的大小排序,然后其它数组都按照第一个数组的调整策略进行调整。

不过需要注意的是:两个数组的元素个数必须相同,不然就会出现一个警告信息:
Warning: array_multisort() [function.array-multisort]: Array sizes are inconsistent in ……

3.array_slice() 函数在数组中根据条件取出一段值,并返回

4.where查询条件类型(TP5)

关联数组和索引数组不能在一个where()中同时使用

(1)关联数组

主要用于等值AND条件

V5.1.13+版本开始增加了关联数组的IN查询支持

// 传入数组作为查询条件
Db::table('think_user')->where([
	'name'	=>	'thinkphp',
    'status'=>	[1, 2]
])->select(); 

(2)索引数组

5.1的数组查询方式有所调整,是为了尽量避免数组方式的条件查询注入。

如果需要事先组装数组查询条件,可以使用:

$map[] = ['name','like','think'];
$map[] = ['status','=',1];
  • 快捷查询

多字段相同查询条件的简化写法

在多个字段之间用|分割表示OR查询,用&分割表示AND查询

$map[] = array('delete_sign&status','=',1);

SELECT `title`,`img_url`,`src` FROM `album` WHERE  ( `delete_sign` = 1 AND `status` = 1 )

 

  • 区间查询

区间查询的查询条件必须使用数组定义方式,支持所有的查询表达式

Db::table('think_user')
    ->where('name', ['like', '%thinkphp%'], ['like', '%kancloud%'], 'or')
    ->where('id', ['>', 0], ['<>', 10], 'and')
    ->find();
$map[] = array('title','like',['a%','b%'],'or');
SELECT `title`,`img_url`,`src` FROM `album` WHERE  (`title` LIKE 'a%' OR `title` LIKE 'b%') 
  • 总结
$map[] = array('title&site','like',['a%','b%'],'or');
SELECT `title`,`img_url`,`src` FROM `album` WHERE  ( (`title` LIKE 'a%' OR `title` LIKE 'b%') AND (`site` LIKE 'a%' OR `site` LIKE 'b%') )

(3)闭包查询 

$name = 'thinkphp';
$id = 10;
Db::table('think_user')->where(function ($query) use($name, $id) {
    $query->where('name', $name)
        ->whereOr('id', '>', $id);
})->select();

可见每个闭包条件两边也会自动加上括号,但需要注意,使用闭包查询的时候不能使用cache(true)数据缓存,而应该使用指定key的方式例如cache('key')。 

 例子

实现:类型 =1 AND (用户名 LIKE %关键词% OR 用户公司名称 LIKE %关键词% OR 用户标签 LIKE %关键词%)

方法一 :

$keyword = input('keyword') ?? '';
$user = (new UserModel)->where('type', 1)
    ->where(function ($query) use ($keyword) {
        if ($keyword != '') {
            $query->whereOr('username', 'like', '%' . $keyword . '%')
                ->whereOr('company_name', 'like', '%' . $keyword . '%')
                ->whereOr('labels', 'like', '%' . $keyword . '%');
        }
    })->select();

方法二 :

$keyword = input('keyword') ?? '';
$user = (new UserModel)->where('type', 1)
    ->where(function ($query) use ($keyword) {
        if ($keyword != '') {
            $query->where("concat(username,company_name,labels) LIKE '%$keyword%' ");
        }
    })->select();

 注意:

 concat(str1, str2,...) 返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。

例子

实现:类型 =1 AND (sort=1 or sort =2 or sort=3)

where('sort',['eq',0],['eq',1],['eq',3],'or')

$map[] = ['sort','like',[0,1,3],'or'];

$map[] = ['sort','in',[0,1,3]];

$map['sort'] = [1,0,3];

注意: 

实现:一个字段符合多个值的查询

1.使用in(值比较少时候)

2.使用like

3.设计表值为枚举类型,可以使用between(推荐

 

5.where查询条件类型(TP3.2)

(1)表达式查询

$map['字段名'] = array('表达式','查询条件');

特殊的

$map['a'] =array('like',array('%thinkphp%','%tp'),'OR');
$map['b'] =array('notlike',array('%thinkphp%','%tp'),'AND');

(a like '%thinkphp%' OR a like '%tp') AND (b not like '%thinkphp%' AND b not like '%tp')

(2)快捷查询

$map['status&score&title'] =array('1',array('gt','0'),'thinkphp','_multi'=>true);

等效于:

$map['status'] = 1;
$map['score'] = array('gt',0);
$map['title'] = 'thinkphp';

'_multi'=>true必须加在数组的最后,表示当前是多条件匹配

快捷查询方式中“|”和“&”不能同时使用。

(3)区间查询

$map['name']  = array(array('like','%a%'), array('like','%b%'), array('like','%c%'), 'ThinkPHP','or'); 

//最后的查询条件是: 
( name LIKE '%a%') OR ( name LIKE '%b%') OR ( name LIKE '%c%') OR ( name = 'ThinkPHP')

(4)组合查询

  • 字符串模式查询

数组条件可以和字符串条件(采用_string 作为查询条件)混合使用,例如:

$User = M("User"); // 实例化User对象
$map['id'] = array('neq',1);
$map['name'] = 'ok';
$map['_string'] = 'status=1 AND score>10';
$User->where($map)->select(); 

最后得到的查询条件就成了:

( `id` != 1 ) AND ( `name` = 'ok' ) AND ( status=1 AND score>10 )
  • 请求字符串查询方式

请求字符串查询是一种类似于URL传参的方式,可以支持简单的条件相等判断。

$map['id'] = array('gt','100');
$map['_query'] = 'status=1&score=100&_logic=or';

得到的查询条件是:

`id`>100 AND (`status` = '1' OR `score` = '100')
  • 复合查询

复合查询相当于封装了一个新的查询条件,然后并入原来的查询条件之中,所以可以完成比较复杂的查询条件组装。 例如:

$where['name']  = array('like', '%thinkphp%');
$where['title']  = array('like','%thinkphp%');
$where['_logic'] = 'or';
$map['_complex'] = $where;
$map['id']  = array('gt',1);

查询条件是

( id > 1) AND ( ( name like '%thinkphp%') OR ( title like '%thinkphp%') )

6.mysql的GROUP_CONCAT()

group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])

7.多维数组查找某个值是否存在

in_array — 检查数组中是否存在某个值,只是这个方法不能检查多维数组。

所以可以编写类似下面的递归方法来检查多维数组。

function deep_in_array($value, $array) {   
        foreach($array as $item) {   
            if(!is_array($item)) {   
                if ($item == $value) {  
                    return true;  
                } else {  
                    continue;
                }  
            }   
                
            if(in_array($value, $item)) {  
                return true;      
            } else if(deep_in_array($value, $item)) {  
                return true;      
            }  
        }   
        return false;   
    }

8.stristr()和strstr()搜索字符串在另一字符串中的第一次出现

9.substr()函数返回字符串的一部分

10.MySQL-if()

11.MySQL中order by 排序遇到NULL值的问题

MySQL数据库,在order by排序的时候,如果存在NULL值,那么NULL是最小的,ASC正序排序的话,NULL值是在最前面的

例如:select * from user order by age;

解决办法:

  • 最优办法:利用MySQL中的一个小技巧,在字段前面加上一个负号,也就是减号,ASC改成DESC ,DESC改成ASC

select * from user order by -age desc;
  • 重新生成一列,比如agenull,利用is null操作符,把NULL值的行变成1,非NULL值的行变成0,先对该字段排序,再对age排序

select * ,age is null as agenull from user order by agenull,age;
  • 直接利用isnull函数对age列求值,跟第一种方法的道理是一样的

select * from user order by isnull(age),age;

12.str_replace() 函数

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值