不灭的焱

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

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

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


  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()->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();