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