不灭的焱

革命尚未成功,同志仍须努力

作者:php-note.com  发布于:2020-03-03 10:21  分类:PHP库/系统/微信  编辑

Codeigniter框架 批量插入insert_batch() 的一个小坑

表单验证器 FormValidator 使用教程


  1. 查询
  2. 搜索
  3. 模糊搜索
  4. 排序
  5. 分页与计数
  6. 查询条件组
  7. 插入数据
  8. 更新数据
  9. 删除数据
  10. 链式方法
  11. 格式化查询结果

一、查询

下面的方法用来构建 SELECT 语句。

db()->findAll();

该方法执行 SELECT 语句并返回查询结果的所有记录:

UserModel::instance()->db()->findAll(); 
// 执行:
// SELECT * FROM `user`

db()->findFrist();

该方法执行 SELECT 语句并返回查询结果的第一条记录:

UserModel::instance()->db()
            ->findFirst();
// 执行:
// SELECT *
// FROM `user`
//  LIMIT 1

db()->getCompiledSelect('user')

该方法和 db()->findAll() 方法一样,编译 SELECT 查询并返回查询的 SQL 语句, 但是,该方法并不执行它。

例如:

$sql = UserModel::instance()->db()->getCompiledSelect('user');
echo $sql;
// 输出:
// SELECT * FROM `user`

db()->select()

该方法用于编写查询语句中的 SELECT 子句:

UserModel::instance()->db()
            ->select('id,username,type')
            ->findAll();
// 执行:
// SELECT `id`, `username`, `type` FROM `user`

注意:如果你要查询表的所有列,可以不用写这个函数,SqlBuilder 会自动查询所有列(SELECT *)。

db()->select() 方法的第二个参数可选,如果设置为 FALSE,SqlBuilder 将不保护你的 表名和字段名,这在当你编写复合查询语句时很有用,不会破坏你编写的语句。

UserModel::instance()->db()
            ->select('(SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4) AS amount_paid', FALSE)
            ->findAll();
// 执行:
// SELECT (SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4) AS amount_paid
// FROM `user`

db()->selectMax()

该方法用于编写查询语句中的 SELECT MAX(field) 部分,你可以使用第二个参数(可选)重命名结果字段。

UserModel::instance()->db()
            ->selectMax('age')
            ->findFirst();
// 执行:
// SELECT MAX(`age`) AS `age`
// FROM `user`
//  LIMIT 1

UserModel::instance()->db()
			->selectMax('age', 'user_age')
			->findFirst();
// 执行:
// SELECT MAX(`age`) AS `user_age`
// FROM `user`
//  LIMIT 1

db()->selectMin()

该方法用于编写查询语句中的 SELECT MIN(field) 部分,和 selectMax() 方法一样, 你可以使用第二个参数(可选)重命名结果字段。

UserModel::instance()->db()
            ->selectMin('age')
            ->findFirst();
// 执行:
// SELECT MIN(`age`) AS `age`
// FROM `user`
//  LIMIT 1

UserModel::instance()->db()
            ->selectMin('age', 'user_age')
            ->findFirst();
// 执行:
// SELECT MIN(`age`) AS `user_age`
// FROM `user`
//  LIMIT 1

db()->selectAvg()

该方法用于编写查询语句中的 SELECT AVG(field) 部分,和 selectMax() 方法一样, 你可以使用第二个参数(可选)重命名结果字段。

UserModel::instance()->db()
            ->selectAvg('age')
            ->findFirst();
// 执行:
// SELECT AVG(`age`) AS `age`
// FROM `user`
//  LIMIT 1

UserModel::instance()->db()
            ->selectAvg('age', 'user_age')
            ->findFirst();
// 执行:
// SELECT AVG(`age`) AS `user_age`
// FROM `user`
//  LIMIT 1

db()->selectSum()

该方法用于编写查询语句中的 SELECT SUM(field) 部分,和 selectMax() 方法一样, 你可以使用第二个参数(可选)重命名结果字段。

UserModel::instance()->db()
            ->selectSum('age')
            ->findFirst();
// 执行:
// SELECT SUM(`age`) AS `age`
// FROM `user`
//  LIMIT 1	

UserModel::instance()->db()
            ->selectSum('age', 'user_age')
            ->findFirst();
// 执行:
// SELECT SUM(`age`) AS `user_age`
// FROM `user`
//  LIMIT 1

db()->from()

该方法用于编写查询语句中的 FROM 子句:

UserModel::instance()->db()
            ->select('id,username,type')
            ->findAll();
// 执行:
// SELECT `id`, `username`, `type`
// FROM `user`			

注意:正如前面所说,查询中的 FROM 部分可以在方法 db()->findAll() 中指定,所以,你可以 选择任意一种你喜欢的方式。

 db()->join()

该方法用于编写查询语句中的 JOIN 子句:

UserModel::instance()->db()
            ->from('user A')
            ->select('A.id,A.type,A.username,B.fax_no')
            ->join('staff B', 'A.id=B.id')
            ->findAll();
// 执行:
// SELECT `A`.`id`, `A`.`type`, `A`.`username`, `B`.`fax_no`
// FROM `user` `A`
// JOIN `staff` `B` ON `A`.`id`=`B`.`id`

如果你的查询中有多个连接,你可以多次调用这个方法。

你可以传入第三个参数指定连接的类型,有这样几种选择:left,right,outer,inner,left outer 和 right outer 。

UserModel::instance()->db()
            ->from('user A')
            ->select('A.id,A.type,A.username,B.fax_no')
            ->join('staff B', 'A.id=B.id', 'left')
            ->findAll();
// 执行:
// SELECT `A`.`id`, `A`.`type`, `A`.`username`, `B`.`fax_no`
// FROM `user` `A`
// LEFT JOIN `staff` `B` ON `A`.`id`=`B`.`id`

db()->innerJoin():内连接

db()->leftJoin():左连接

db()->rightJoin():右连接

二、搜索

db()->where()

该方法提供了4种方式让你编写查询语句中的 WHERE 子句:

注意:所有的数据将会自动转义,生成安全的查询语句。

1. 简单的 key/value 方式: 

$name = 'wenjianbao';
UserModel::instance()->db()
            ->from('user')
            ->select('id,type')
            ->where('username', $name)
            ->findAll();
// 执行:
// SELECT `id`, `type`
// FROM `user`
// WHERE `username` = 'wenjianbao'o'

注意自动为你加上了等号。

如果你多次调用该方法,那么多个 WHERE 条件将会使用 AND 连接起来:

$name   = 'wenjianbao';
$age    = 18;
$status = 1;
UserModel::instance()->db()
            ->select('id,type')
            ->where('username', $name)
            ->where('age', $age)
            ->where('status', $status)
            ->findAll();
// 执行:
// SELECT `id`, `type`
// FROM `user`
// WHERE `username` = 'wenjianbao'
// AND `age` = 18
// AND `status` = 1

2. 自定义 key/value 方式:

为了控制比较,你可以在第一个参数中包含一个比较运算符:

$name = 'wenjianbao';
$age  = 18;
UserModel::instance()->db()
            ->select('id,type')
            ->where('username !=', $name)
            ->where('age <', $age)
            ->findAll();
// 执行:
// SELECT `id`, `type`
// FROM `user`
// WHERE `username` != 'wenjianbao'
// AND `age` < 18

3. 关联数组方式:

$where = [
	'age'      => 18,
	'username' => 'wenjianbao',
	'status'   => 1
];
UserModel::instance()->db()
            ->select('*')
            ->where($where)
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// WHERE `age` = 18
// AND `username` = 'wenjianbao'
// AND `status` = 1

你也可以在这个方法里包含你自己的比较运算符:

$where = [
	'age >'       => 18,
	'username !=' => 'wenjianbao',
	'status'      => 1
];
UserModel::instance()->db()
            ->select('*')
            ->where($where)
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// WHERE `age` > 18
// AND `username` != 'wenjianbao'
// AND `status` = 1

4. 自定义字符串:

$where = "username='wenjianbao' AND status=1 OR status=2";
UserModel::instance()->db()
            ->select('*')
            ->where($where)
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// WHERE `username` = 'wenjianbao' AND `status` = 1 OR `status` = 2

db()->where() 方法有一个可选的第三个参数,如果设置为 FALSE,SqlBuilder 将不保护你的表名和字段名。

UserModel::instance()->db()
            ->select('*')
            ->where('MATCH (field) AGAINST ("value")', null, false)
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// WHERE MATCH (field) AGAINST ("value")

db()->orWhere()

这个方法和上面的方法一样,只是多个 WHERE 条件之间使用 OR 进行连接:

$name = 'wenjianbao';
$age  = 18;
UserModel::instance()->db()
            ->select('*')
            ->where('username !=', $name)
            ->orWhere('age >', $age)
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// WHERE `username` != 'wenjianbao'
// OR `age` > 18

db()->whereIn()

该方法用于生成 WHERE IN 子句,多个子句之间使用 AND 连接

$names = ['张三', '李四', '王二'];
UserModel::instance()->db()
            ->select('*')
            ->whereIn('username', $names)
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// WHERE `username` IN('张三', '李四', '王二')
UserModel::instance()->db()
            ->where('status', 1)
            ->whereIn('id', 'SELECT id FROM staff WHERE age > 18', false)
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// WHERE `status` = 1
// AND id IN(SELECT id FROM staff WHERE age > 18)

db()->orWhereIn()

该方法用于生成 WHERE IN 子句,多个子句之间使用 OR 连接

$names = ['张三', '李四', '王二'];
UserModel::instance()->db()
            ->select('*')
            ->where('age', 18)
            ->oRwhereIn('username', $names)
            ->findAll();
// 执行:	
// SELECT *
// FROM `user`
// WHERE `age` = 18
// OR `username` IN('张三', '李四', '王二')

db()->whereNotIn()

该方法用于生成 WHERE NOT IN 子句,多个子句之间使用 AND 连接

$names = ['张三', '李四', '王二'];
UserModel::instance()->db()
            ->select('*')
            ->where('age', 18)
            ->whereNotIn('username', $names)
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// WHERE `age` = 18
// AND `username` NOT IN('张三', '李四', '王二')

db()->orWhereNotIn()

该方法用于生成 WHERE NOT IN 子句,多个子句之间使用 OR 连接 

$names = ['张三', '李四', '王二'];
UserModel::instance()->db()
            ->select('*')
            ->where('age', 18)
            ->oRwhereNotIn('username', $names)
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// WHERE `age` = 18
// OR `username` NOT IN('张三', '李四', '王二')

三、模糊搜索

db()->like()

 该方法用于生成 LIKE 子句,在进行搜索时非常有用。

注意:所有数据将会自动被转义。

1.  简单 key/value 方式:

UserModel::instance()->db()
            ->select('*')
            ->like('username', 'wenjianbao')
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// WHERE `username` LIKE '%wenjianbao%' ESCAPE '!'

如果你多次调用该方法,那么多个 WHERE 条件将会使用 AND 连接起来:

UserModel::instance()->db()
            ->select('*')
            ->like('username', 'wenjianbao')
            ->like('address', '深圳南山')
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// WHERE `username` LIKE '%wenjianbao%' ESCAPE '!'
// AND  `address` LIKE '%深圳南山%' ESCAPE '!'

可以传入第三个可选的参数来控制 LIKE 通配符(%)的位置,可用选项有:'before','after' 和 'both' (默认为 'both')。

UserModel::instance()->db()
            ->select('*')
            ->like('username', 'wenjianbao', 'before')
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// WHERE `username` LIKE '%wenjianbao' ESCAPE '!'
UserModel::instance()->db()
            ->select('*')
            ->like('username', 'wenjianbao', 'after')
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// WHERE `username` LIKE 'wenjianbao%' ESCAPE '!'
UserModel::instance()->db()
            ->select('*')
            ->like('username', 'wenjianbao', 'both')
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// WHERE `username` LIKE '%wenjianbao%' ESCAPE '!'

2. 关联数组方式:

$array = [
	'username' => 'wenjianbao',
	'address'  => '深圳南山',
	'company'  => '华为'
];
UserModel::instance()->db()
            ->select('*')
            ->like($array)
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// WHERE `username` LIKE '%wenjianbao%' ESCAPE '!'
// AND  `address` LIKE '%深圳南山%' ESCAPE '!'
// AND  `company` LIKE '%华为%' ESCAPE '!'

db()->orLike()

这个方法和上面的方法一样,只是多个 WHERE 条件之间使用 OR 进行连接:

UserModel::instance()->db()
            ->select('*')
            ->like('username', 'wenjianbao')
            ->orLike('address', '深圳南山')
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// WHERE `username` LIKE '%wenjianbao%' ESCAPE '!'
// OR  `address` LIKE '%深圳南山%' ESCAPE '!'

db()->notLike()

这个方法和 like() 方法一样,只是生成 NOT LIKE 子句:

UserModel::instance()->db()
            ->select('*')
            ->like('username', 'wenjianbao')
            ->notLike('address', '深圳南山')
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// WHERE `username` LIKE '%wenjianbao%' ESCAPE '!'
// AND  `address` NOT LIKE '%深圳南山%' ESCAPE '!'

db()->orNotLike()

这个方法和 notLike() 方法一样,只是多个 WHERE 条件之间使用 OR 进行连接:

UserModel::instance()->db()
            ->select('*')
            ->like('username', 'wenjianbao')
            ->orNotLike('address', '深圳南山')
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// WHERE `username` LIKE '%wenjianbao%' ESCAPE '!'
// OR  `address` NOT LIKE '%深圳南山%' ESCAPE '!'

db()->groupBy()

该方法用于生成 GROUP BY 子句:

UserModel::instance()->db()
            ->select('*')
            ->groupBy('type')
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// GROUP BY `type`

你也可以通过一个数组传入多个值:

UserModel::instance()->db()
            ->select('*')
            ->groupBy(['type', 'age'])
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// GROUP BY `type`, `age`

db()->distinct()

该方法用于向查询中添加 DISTINCT 关键字:

UserModel::instance()->db()
            ->distinct()
            ->findAll();
// 执行:
// SELECT DISTINCT *
// FROM `user`

db()->having() 

该方法用于生成 HAVING 子句,有下面两种不同的语法:

UserModel::instance()->db()
            ->having('id=45')
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// HAVING `id` = 45
UserModel::instance()->db()
            ->having('id', 45)
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// HAVING `id` = 45

你也可以通过一个数组传入多个值:

$having = [
    'username' => 'wenjianbao',
    'id <'     => 100
];
UserModel::instance()->db()
            ->having($having)
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// HAVING `username` = 'wenjianbao'
// AND `id` < 100

如果 SqlBuilder 自动转义你的查询,为了避免转义,你可以将第三个参数设置为 FALSE 。

UserModel::instance()->db()
            ->having('id', 45)
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// HAVING `id` = 45

UserModel::instance()->db()
            ->having('id', 45, false)
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// HAVING id =  45

db()->orHaving()

该方法和 having() 方法一样,只是多个条件之间使用 OR 进行连接。

四、排序

db()->orderBy()

该方法用于生成 ORDER BY 子句。

第一个参数为你想要排序的字段名,第二个参数用于设置排序的方向, 可选项有: ASC(升序),DESC(降序)和 RANDOM (随机)。

UserModel::instance()->db()
            ->orderBy('id', 'desc')
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// ORDER BY `id` DESC

第一个参数也可以是你自己的排序字符串:

UserModel::instance()->db()
            ->orderBy('id desc, age asc')
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// ORDER BY `id` desc, `age` asc

如果需要根据多个字段进行排序,可以多次调用该方法。

UserModel::instance()->db()
            ->orderBy('id', 'desc')
            ->orderBy('age', 'asc')
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// ORDER BY `id` DESC, `age` ASC

如果你选择了 RANDOM (随机排序),第一个参数会被忽略,但是你可以传入一个 数字值,作为随机数的 seed。

UserModel::instance()->db()
            ->orderBy('username', 'RANDOM')
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// ORDER BY RAND()
UserModel::instance()->db()
            ->orderBy(42, 'RANDOM')
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// ORDER BY RAND(42)

五、分页与计数

db()->limit()

该方法用于限制你的查询返回结果的数量:

UserModel::instance()->db()
            ->limit(10)
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
//  LIMIT 10

第二个参数可以用来设置偏移。

UserModel::instance()->db()
            ->limit(10, 20)
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
//  LIMIT 20, 10

 db()->findCount()

该方法用于获取特定查询返回结果的数量,也可以使用查询构造器的这些方法: where(),or_where(),like(),or_like() 等等。举例: 

$count = UserModel::instance()->db()
            ->where('age', 18)
            ->findCount();
// 执行:
// SELECT COUNT(*) AS `numrows`
// FROM `user`
// WHERE `age` = 18

六、查询条件组

查询条件组可以让你生成用括号括起来的一组 WHERE 条件,这能创造出非常复杂的 WHERE 子句, 支持嵌套的条件组。例如:

UserModel::instance()->db()
            ->groupStart()
                ->where('username !=', 'wenjianbao')
                ->groupStart()
                    ->where('age <', 18)
                    ->orWhere('age >', 30)
                ->groupEnd()
            ->groupEnd()
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// WHERE   (
// `username` != 'wenjianbao'
// AND    (
// `age` < 18
// OR `age` > 30
//   )
//  )

注意:条件组必须要配对,确保每个 groupStart() 方法都有一个 groupEnd() 方法与之配对。

 db()->groupStart()

 开始一个新的条件组,为查询中的 WHERE 条件添加一个左括号。

db()->orGroupStart()

开始一个新的条件组,为查询中的 WHERE 条件添加一个左括号,并在前面加上 OR 。

db()->notGroupStart()

 开始一个新的条件组,为查询中的 WHERE 条件添加一个左括号,并在前面加上 NOT 。

db()->orNotGroupStart()

开始一个新的条件组,为查询中的 WHERE 条件添加一个左括号,并在前面加上 OR NOT 。

db()->groupEnd()

结束当前的条件组,为查询中的 WHERE 条件添加一个右括号。 

七、插入数据

db()->insert()

该方法根据你提供的数据生成一条 INSERT 语句并执行,它的参数是一个**数组** 或一个**对象**,下面是使用数组的例子:

$row = [
    'username' => 'wenjianbao',
    'age'      => 18,
    'status'   => 1
];
UserModel::instance()->db()
            ->set($row)
            ->insert();
// 执行:
// INSERT INTO `user` (`username`, `age`, `status`) VALUES ('wenjianbao', 18, 1)

或者这样:第一个参数为要插入的表名,第二个参数为要插入的数据,是个关联数组。

$row = [
    'username' => 'wenjianbao',
    'age'      => 18,
    'status'   => 1
];
UserModel::instance()->db()
            ->insert('user', $row);
// 执行:
// INSERT INTO `user` (`username`, `age`, `status`) VALUES ('wenjianbao', 18, 1)

下面是使用对象的例子:

class Myclass {
    public $id       = 29;
    public $username = 'wenjianbao';
    public $age      = 18;
}

UserModel::instance()->db()
            ->insert('user', new Myclass());
// 执行:
INSERT INTO `user` (`id`, `username`, `age`) VALUES (29, 'wenjianbao', 18)

第一个参数为要插入的表名,第二个参数为要插入的数据,是个对象。

注意:所有数据会被自动转义,生成安全的查询语句。

db()->getCompiledInsert()

该方法和 $this->db->insert() 方法一样根据你提供的数据生成一条 INSERT 语句,但是并不执行。

例如:

$row = [
    'username' => 'wenjianbao',
    'age'      => 18,
    'status'   => 1
];
$sql = UserModel::instance()->db()
                    ->from('user')
                    ->set($row)
                    ->getCompiledInsert();
echo $sql;
// 输出:
// INSERT INTO `user` (`username`, `age`, `status`) VALUES ('wenjianbao', 18, 1)

db()->insertBatch()

该方法根据你提供的数据生成一条 INSERT 语句并执行,它的参数是一个**数组** 或一个**对象**,下面是使用数组的例子:

$rows = [
	[
		'username' => '张三',
		'age'      => 18,
		'status'   => 1
	],
	[
		'username' => '李四',
		'age'      => 19,
		'status'   => 2
	]
];
UserModel::instance()->db()
            ->insertBatch($rows);
// 执行:
// INSERT INTO `user` (`age`, `status`, `username`) VALUES (18,1,'张三'), (19,2,'李四')

八、更新数据

db()->replace()

该方法用于执行一条 REPLACE 语句,REPLACE 语句根据表的**主键**和**唯一索引** 来执行,类似于标准的 DELETE + INSERT 。 使用这个方法,你不用再手工去实现 select(),update(),delete() 以及 insert() 这些方法的不同组合,为你节约大量时间。

例如:

$data = [
	'username' => '温建宝',
	'age'      => 18,
	'status'   => 1
];
UserModel::instance()->db()
            ->replace($data);
// 执行:
// REPLACE INTO `user` (`username`, `age`, `status`) VALUES ('温建宝', 18, 1)

上面的例子中,我们假设 username 字段是我们的主键,那么如果我们数据库里有一行 的 username 列的值为 '张三',这一行将会被删除并被我们的新数据所取代。

也可以使用 set() 方法,而且所有字段都被自动转义,正如 insert() 方法一样。

db()->set()

该方法用于设置新增或更新的数据。

该方法可以取代直接传递数据数组到 insert 或 update 方法:

UserModel::instance()->db()
            ->set('username', 'wenjianbao')
            ->insert();
// 执行:
// INSERT INTO `user` (`username`) VALUES ('wenjianbao')

如果你多次调用该方法,它会正确组装出 INSERT 或 UPDATE 语句来:

UserModel::instance()->db()
            ->set('username', 'wenjianbao')
            ->set('age', 18)
            ->set('status', 1)
            ->insert();
// 执行:
// INSERT INTO `user` (`username`, `age`, `status`) VALUES ('wenjianbao', 18, 1)

set() 方法也接受可选的第三个参数($escape),如果设置为 FALSE,数据将不会自动转义。为了说明两者之间的区别,这里有一个带转义的 set() 方法和不带转义的例子。

UserModel::instance()->db()
            ->set('age', 'age+1', false)
            ->where('id', 1)
            ->update();
// 执行:
// UPDATE `user` SET age = age+1
// WHERE `id` = 1

你也可以传一个关联数组作为参数:

$data = [
	'username' => 'wenjianbao',
	'age'      => 18,
	'status'   => 1
];
UserModel::instance()->db()
            ->set($data)
            ->insert();
// 执行:
// INSERT INTO `user` (`username`, `age`, `status`) VALUES ('wenjianbao', 18, 1)

或者一个对象:

class MyClass {
    public $username = 'wenjianbao';
    public $age      = 18;
    public $status   = 1;
}

UserModel::instance()->db()
            ->set(new MyClass())
            ->insert();
// 执行:
// INSERT INTO `user` (`username`, `age`, `status`) VALUES ('wenjianbao', 18, 1)

db()->update()

该方法根据你提供的数据生成一条 UPDATE 语句并执行,它的参数是一个 数组 或一个 对象 ,下面是使用数组的例子:

$update = [
	'username' => '张三',
	'age'      => 18,
	'status'   => 1
];
UserModel::instance()->db()
            ->where('id', 2)
            ->update($update);
// 执行:
// UPDATE `user` SET `username` = '张三', `age` = 18, `status` = 1
// WHERE `id` = 2

或者你可以使用一个对象:

class Myclass {
    public $username = 'wenjianbao';
    public $age      = 18;
    public $status   = 2;
}

UserModel::instance()->db()
            ->where('id', 2)
            ->update(new Myclass());
// 执行:
// UPDATE `user` SET `username` = 'wenjianbao', `age` = 18, `status` = 2
// WHERE `id` = 2

注意:所有数据会被自动转义,生成安全的查询语句。

另外,db()->where() 方法的使用,它可以为你设置 WHERE 子句, 你也可以直接使用字符串形式设置 WHERE 子句:

$update = [
	'username' => 'wenjianbao',
	'age'      => 18
];
UserModel::instance()->db()
            ->update($update, 'id=4');
// 执行:
// UPDATE `user` SET `username` = 'wenjianbao', `age` = 18
// WHERE `id` = 4

或者使用一个数组:

$update = [
	'username' => 'wenjianbao',
	'age'      => 18
];
UserModel::instance()->db()
            ->update($update, ['id' => 4]);
// 执行:
// UPDATE `user` SET `username` = 'wenjianbao', `age` = 18
// WHERE `id` = 4

当执行 UPDATE 操作时,你还可以使用上面介绍的 db()->set() 方法。

db()->updateBatch()

该方法根据你提供的数据生成一条 UPDATE 语句并执行,它的参数是一个**数组** 或一个**对象**,下面是使用数组的例子:

$data = [
	[
		'username' => '张三',
		'age'      => 18,
		'status'   => 2
	],
	[
		'username' => '李四',
		'age'      => 28,
		'status'   => 3
	],
];
UserModel::instance()->db()
            ->updateBatch($data, 'username');
// 执行:
// UPDATE `user` SET `age` = CASE 
// WHEN `username` = '张三' THEN 18
// WHEN `username` = '李四' THEN 28
// ELSE `age` END, `status` = CASE 
// WHEN `username` = '张三' THEN 2
// WHEN `username` = '李四' THEN 3
// ELSE `status` END
// WHERE `username` IN('张三','李四')

第一个参数为要更新的数据,是个二维数组,第三个 参数是 WHERE 语句的键。

注意:所有数据会被自动转义,生成安全的查询语句。

db()->getCompiledUpdate() 

该方法和 db()->getCompiledInsert() 方法完全一样,除了生成的 SQL 语句是 UPDATE 而不是 INSERT。

九、删除数据

db()->delete()

该方法生成 DELETE 语句并执行。

UserModel::instance()->db()
            ->delete(['id' => 3]);
// 执行:
// DELETE FROM `user`
// WHERE `id` = 3

第一个参数为 WHERE 条件。你也可以不用第一个参数, 使用 where() 或者 orWhere() 函数来替代它:

UserModel::instance()->db()
            ->where('id', 3)
            ->delete();
// 执行:
// DELETE FROM `user`
// WHERE `id` = 3

如果你想要从多个表中删除数据,你也可以将由多个表名构成的数组传给 delete() 方法。

如果你想要删除一个表中的所有数据,可以使用 truncate() 或 emptyTable() 方法。

db()->emptyTable()

该方法生成 DELETE 语句并执行:

UserModel::instance()->db()
            ->emptyTable();
// 执行:
// DELETE FROM `user`

db()->truncate() 

该方法生成 TRUNCATE 语句并执行。

UserModel::instance()->db()
            ->truncate();
// 执行:
// TRUNCATE `user`

db()->getCompiledDelete()

该方法和 db()->getCompiledInsert() 方法完全一样,除了生成的 SQL 语句是 DELETE 而不是 INSERT。 

十、链式方法

通过将多个方法连接在一起,链式方法可以大大的简化你的语法。感受一下这个例子:

UserModel::instance()->db()
            ->where('age', 18)
            ->limit(10, 3)
            ->findAll();
// 执行:
// SELECT *
// FROM `user`
// WHERE `age` = 18
//  LIMIT 3, 10

十一、格式化查询结果

db()->findColumn()

获取二维数组的指定列,组成新的数组输出。内部其实是调用的 array_column(),详细使用说明参考:

PHP array_column() 用法

db()->findField()

 获取某个字段值

UserModel::instance()->db()
            ->where('id', 3)
            ->findField('username');
// 获取 id=3 的用户的“用户名”

// 执行:
// SELECT `username`
// FROM `user`
// WHERE `id` = 3
//  LIMIT 1

db()->findPage()

 查询分页,返回以下数据结构:

Array
(
    [page] => 1
    [pageSize] => 10
    [pageCount] => 0
    [pageStr] => 
    [rowCount] => 0
    [rowList] => Array
        (
        )

)

 

十二、其他参考

-- 设置某个字段为 null
Model::instance()->db()
        ->from('yw1_scsheet')
        ->where('POrderId', $POrderId)
        ->set('scDate', 'null', false)
        ->update();