ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ### 创建查询生成器 ~~~php $db = \Lying::$maker->db; $query = $db->query(); ~~~ ### 使用查询生成器 ~~~php $db = \Lying::$maker->db; $query = $db->query(); //select `id`,`username`,`sex` from `user` where id=1 $query->select('id,username,sex') ->from('user') ->where('id=1'); //select `id`,`username` as `name`,`sex` from `user` where id=1 $query->select(['id', 'name'=>'username', 'sex']) ->from(['user']) ->where(['id'=>1]); //SELECT `u`.`id`, `u`.`username` AS `name`, `sex` FROM `user` AS `u` WHERE `id`=1 $query->select(['u.id', 'name'=>'u.username', 'u.sex']) ->from(['u'=>'user']) ->where(['id'=>1]); //支持的查询方法,具体使用方式请看方法详解 $query->select() ->distinct() ->from() ->where() ->andWhere() ->orWhere() ->join() ->leftJoin() ->rightJoin() ->innerJoin() ->groupBy() ->having() ->andHaving() ->orHaving() ->orderBy() ->limit() ->union(); ~~~ > 具体使用方式请看方法详解 [查询方法详解](queryMethod.md) ### 获取查询SQL和将要绑定的参数 ~~~php $db = \Lying::$maker->db; $query = $db->query(); //select `id`,`username`,`sex` from `user` where id=1 $query->select('id,username,sex') ->from('user') ->where(['id'=>1]); list($sql, $params) = $query->build(); //取出来的sql并不是规范的sql,但是可以用此方式执行: $db->prepare($sql, $params)->one(); ~~~ ### 获取查询结果 ~~~php $db = \Lying::$maker->db; $query = $db->query(); //select `id`,`username`,`sex` from `user` where id=1 $query->select('id,username,sex') ->from('user') ->where(['id'=>1]); $query->one(); //返回结果集中的一条记录 $query->all(); //返回所有查询结果的数组 $query->scalar(); //从结果集中的下一行返回单独的一个字段值,查询结果为标量 $query->column(); //从结果集中的取出第N列的值 $query->count(); //获取指定列的记录数 $query->sum(); //获取指定列所有值之和 $query->max(); //获取指定列的最大值 $query->min(); //获取指定列的最小值 $query->avg(); //获取指定列的平均值 $query->inc(); //字段值自增 $query->dec(); //字段值自减 ~~~ ### 插入/更新/删除操作 #### 插入数据 插入单条数据 ~~~php $db = \Lying::$maker->db; $query = $db->query(); $data = [ 'username' => 'user1', 'sex' => 1, 'password' => '123456', ]; $rows = $query->insert('user', $data); //insert into $rows = $query->insert('{{%user}}', $data); //use table name with prefix $rows = $query->insert('user', $data, true); //replace into ~~~ 批量插入数据 ~~~php $db = \Lying::$maker->db; $query = $db->query(); $fields = ['name', 'sex']; $datas = [ ['user1', 1], ['user2', 0], ['user3', 1], ]; $rows = $query->batchInsert('user', $fields, $datas); //insert into $rows = $query->batchInsert('{{%user}}', $fields, $datas); //use table name with prefix $rows = $query->batchInsert('user', $fields, $datas, true); //replace into ~~~ > 请注意,批量插入使用拼接sql的方式,受限于sql语句的最大长度! #### 更新数据 ~~~php $db = \Lying::$maker->db; $query = $db->query(); $where = ['>', 'id', 100]; $data = ['money'=>'500']; $rows = $query->update('user', $data, $where); //或者 $rows = $query->where($where)->update('{{%user}}', $data); //use table name with prefix ~~~ > where的使用方式请参考where函数的详细说明 #### 删除操作 ~~~php $db = \Lying::$maker->db; $query = $db->query(); $where = ['id'=>100]; $rows = $query->delete('user', $where); //或者 $rows = $query->where($where)->delete('{{%user}}'); //use table name with prefix ~~~ > where的使用方式请参考where函数的详细说明 ### 函数参考 ~~~php /** * 设置要查询的字段 * ```php * select('id, lying.sex, count(id) as count') * select(['id', 'lying.sex', 'count'=>'count(id)', 'q'=>$query]) * 其中$query为Query实例,必须指定子查询的别名,只有$columns为数组的时候才支持子查询 * 注意:当你使用到包含逗号的数据库表达式的时候,你必须使用数组的格式,以避免自动的错误的引号添加 * select(["CONCAT(first_name, ' ', last_name) AS full_name", 'email']); * ``` * @param string|array $columns 要查询的字段,当没有设置要查询的字段的时候,默认为'*' * @return $this */ public function select($columns); ~~~ * * * * * ~~~php /** * 去除重复行 * @param bool $distinct 是否去重 * @return $this */ public function distinct($distinct = true); ~~~ * * * * * ~~~php /** * 设置要查询的表 * ```php * from('user, lying.admin as ad') * from(['user', 'ad'=>'lying.admin', 'q'=>$query]) * 其中$query为Query实例,必须指定子查询的别名,只有$tables为数组的时候才支持子查询 * ``` * @param string|array $tables 要查询的表 * @return $this */ public function from($tables); ~~~ * * * * * ~~~php /** * 设置表连接,可多次调用 * @param string $type 连接类型,可以为'left join','right join','inner join' * @param string|array $table 要连接的表,子查询用数组形式表示,键为别名,值为Query实例 * @param string|array $on 条件,如果要使用'字段1 = 字段2'的形式,请用字符串带入,用数组的话'字段2'将被解析为绑定参数 * @param array $params 绑定的参数,应为key=>value形式 * @return $this */ public function join($type, $table, $on = null, $params = []); ~~~ * * * * * ~~~php /** * 设置表左连接,可多次调用 * @param string|array $table 要连接的表,子查询用数组形式表示,键为别名,值为Query实例 * @param string|array $on 条件,如果要使用'字段1 = 字段2'的形式,请用字符串带入,用数组的话'字段2'将被解析为绑定参数 * @param array $params 绑定的参数,应为key=>value形式 * @return $this */ public function leftJoin($table, $on = null, $params = []); ~~~ * * * * * ~~~php /** * 设置表右连接,可多次调用 * @param string|array $table 要连接的表,子查询用数组形式表示,键为别名,值为Query实例 * @param string|array $on 条件,如果要使用'字段1 = 字段2'的形式,请用字符串带入,用数组的话'字段2'将被解析为绑定参数 * @param array $params 绑定的参数,应为key=>value形式 * @return $this */ public function rightJoin($table, $on = null, $params = []); ~~~ * * * * * ~~~php /** * 设置表连接,可多次调用 * @param string|array $table 要连接的表,子查询用数组形式表示,键为别名,值为Query实例 * @param string|array $on 条件,如果要使用'字段1 = 字段2'的形式,请用字符串带入,用数组的话'字段2'将被解析为绑定参数 * @param array $params 绑定的参数,应为key=>value形式 * @return $this */ public function innerJoin($table, $on = null, $params = []); ~~~ * * * * * ~~~php /** * 设置查询条件 * ```php * 如果要使用'字段1 = 字段2'的形式,请用字符串带入,用数组的话'字段2'将被解析为绑定参数 * where("user.id = admin.id and name = :name", [':name'=>'lying']); * where(['id'=>1, 'name'=>'lying']); * where(['id'=>[1, 2, 3], ['or', 'name'=>'lying', 'sex'=>1]]); * ``` * @param string|array $condition 要查询的条件 * @param array $params 当$condition为字符串时,绑定参数的数组 * @return $this */ public function where($condition, $params = []); ~~~ * * * * * ~~~php /** * 添加AND条件 * @param string|array $condition 要查询的条件 * @param array $params 当$condition为字符串时,绑定参数的数组 * @return $this * @see where() */ public function andWhere($condition, $params = []); ~~~ * * * * * ~~~php /** * 添加OR条件 * @param string|array $condition 要查询的条件 * @param array $params 当$condition为字符串时,绑定参数的数组 * @return $this * @see where() */ public function orWhere($condition, $params = []); ~~~ * * * * * ~~~php /** * 设置分组查询 * ```php * groupBy('id, sex'); * groupBy(['id', 'sex']); * ``` * @param string|array 要分组的字段 * @return $this */ public function groupBy($columns); ~~~ * * * * * ~~~php /** * 聚合筛选 * @param string|array $condition 参见where() * @param array $params 参见where() * @return $this * @see where() */ public function having($condition, $params = []); ~~~ * * * * * ~~~php /** * 添加AND条件 * @param string|array $condition 要查询的条件 * @param array $params 当$condition为字符串时,绑定参数的数组 * @return $this * @see having() */ public function andHaving($condition, $params = []); ~~~ * * * * * ~~~php /** * 添加OR条件 * @param string|array $condition 要查询的条件 * @param array $params 当$condition为字符串时,绑定参数的数组 * @return $this * @see having() */ public function orHaving($condition, $params = []); ~~~ * * * * * ~~~php /** * 设置排序 * ```php * orderBy('id, name desc'); * orderBy(['id'=>SORT_DESC, 'name']); * ``` * @param string|array $columns 要排序的字段和排序方式 * @return $this */ public function orderBy($columns); ~~~ * * * * * ~~~php /** * 设置限制查询的条数 * ```php * limit(10); * limit(5, 20); * ``` * @param int $offset 偏移的条数,如果只提供此参数,则等同于limit(0, $offset) * @param int $limit 限制的条数 * @return $this */ public function limit($offset, $limit = null); ~~~ * * * * * ~~~php /** * 设置联合查询,可多次使用 * @param Query $query 子查询 * @param bool $all 是否使用UNION ALL,默认false * @return $this */ public function union(Query $query, $all = false); ~~~ * * * * * ~~~php /** * 组建SQL语句 * @param array $params 传入参数 * @return array 返回[$statement, $params] */ public function build($params = []); ~~~ * * * * * ~~~php /** * 返回结果集中的一条记录 * @param bool $obj 是否返回对象(默认返回关联数组) * @param string $class 要实例化的对象,不写默认为匿名对象 * @return mixed 成功返回查询结果,失败返回false */ public function one($obj = false, $class = null); ~~~ * * * * * ~~~php /** * 返回所有查询结果的数组 * @param bool $obj 是否返回对象(默认返回关联数组) * @param string $class 要实例化的对象,不写默认为匿名对象 * @return mixed 成功返回查询结果,失败返回false */ public function all($obj = false, $class = null); ~~~ * * * * * ~~~php /** * 从结果集中的下一行返回单独的一个字段值,查询结果为标量 * @param int $columnNumber 你想从行里取回的列的索引数字,以0开始 * @return mixed 返回查询结果,查询结果为标量 */ public function scalar($columnNumber = 0); ~~~ * * * * * ~~~php /** * 从结果集中的取出第N列的值 * @param int $columnNumber 你想从行里取回的列的索引数字,以0开始 * @return mixed 返回查询结果 */ public function column($columnNumber = 0); ~~~ * * * * * ~~~php /** * 获取指定列的记录数 * @param string $column 要统计的列名 * @return bool|int 返回记录数 */ public function count($column = '*'); ~~~ * * * * * ~~~php /** * 获取指定列所有值之和 * @param string $column 要相加的列名 * @return bool|float 返回相加后的值 */ public function sum($column); ~~~ * * * * * ~~~php /** * 获取指定列的最大值 * @param string $column 计算的列名 * @return bool|float 最大值 */ public function max($column); ~~~ * * * * * ~~~php /** * 获取指定列的最小值 * @param string $column 计算的列名 * @return bool|float 最小值 */ public function min($column); ~~~ * * * * * ~~~php /** * 获取指定列的平均值 * @param string $column 计算的列名 * @return bool|float 平均值 */ public function avg($column); ~~~ * * * * * ~~~php /** * 字段值自增 * ```php * $query->from('user')->where(['id'=>1])->inc('num'); * ``` * @param string $field 字段名 * @param int $num 自增的值,必须为正整数 * @return bool|int 成功返回受影响的行数,失败返回false */ public function inc($field, $num = 1); ~~~ * * * * * ~~~php /** * 字段值自减 * ```php * $query->from('user')->where(['id'=>1])->dec('num'); * ``` * @param string $field 字段名 * @param int $num 自减的值,必须为正整数 * @return bool|int 成功返回受影响的行数,失败返回false */ public function dec($field, $num = 1); ~~~ * * * * * ~~~php /** * 插入一条数据 * @param string $table 要插入的表名 * @param array $datas 要插入的数据,(name => value)形式的数组 * 当然value可以是子查询,Query的实例,但是查询的表不能和插入的表是同一个 * @param bool $replace 是否用REPLACE INTO * @return int|bool 返回受影响的行数,有可能是0行,失败返回false */ public function insert($table, $datas, $replace = false); ~~~ * * * * * ~~~php /** * 批量插入数据 * ```php * batchInsert('user', ['name', 'sex'], [ * ['user1', 1], * ['user2', 0], * ['user3', 1], * ]) * ``` * @param string $table 要插入的表名 * @param array $columns 要插入的字段名 * @param array $datas 要插入的数据,应为一个二维数组 * @param bool $replace 是否用REPLACE INTO * @return int|bool 返回受影响的行数,有可能是0行,失败返回false */ public function batchInsert($table, $columns, $datas, $replace = false); ~~~ * * * * * ~~~php /** * 更新数据 * @param string $table 要更新的表名 * @param array $datas 要更新的数据,(name => value)形式的数组 * 当然value可以是子查询,Query的实例,但是查询的表不能和更新的表是同一个 * @param string|array $condition 更新的条件,参见where() * @param array $params 条件的参数,参见where() * @return int|bool 返回受影响的行数,有可能是0行,失败返回false */ public function update($table, $datas, $condition = '', $params = []); ~~~ * * * * * ~~~php /** * 删除数据 * @param string $table 要删除的表名 * @param string|array $condition 删除的条件,参见where() * @param array $params 条件的参数,参见where() * @return int|bool 返回受影响的行数,有可能是0行,失败返回false */ public function delete($table, $condition = '', $params = []); ~~~