MySQL批量处理大数据:
- db()->insertBatch() // 批量插入
- db()->updateBatch() // 批量修改
- 查询
- 搜索
- 模糊搜索
- 排序
- 分页与计数
- 查询条件组
- 插入数据
- 更新数据
- 删除数据
- 链式方法
- 格式化查询结果
一、查询
下面的方法用来构建 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(),详细使用说明参考:
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) // 方式1 ->set('remark', null) // 方式2 ->update();