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() 函数