ThinkPHP 6 数据库查询,where 、or、and

1.查询数据库的方式三种

  • 数据库查询(Db类) Db::name()->where()->select()
  • 实例化模型查询(建立模型model ) $userModel = new userModel(); $userModel->where()->select()
  • 使用查询构造器(调用数据库链式操作和查询方法) UserModel::where()->select()

俩种查询方式返回的数据格式也不一样。一种是数组,一种是数据集对象(think\Collection),和数组无差别用法,并且额外分装了些方法。

数据库的查询结果默认返回数据集对象

模型中进行的数据集查询,全部返回数据集对象

查询的方式主要是 查询多条->select() 和 查询单条 ->find()

 

模型查询

数据库查询

->select()

数据集(对象 think\Collection的数组)

数据集 (对象 think\Collection的数组)

->find()

数据( 对象 think\Collection)

数组

判断为空:数据集必须用$result->isEmpty().来操作。不能用empty($result);

数据集转化为数据:$result->toArray()

这里要值得注意的是:只有模型查询下的find(), 在查不到返回结果时,返回的是NULL。这个时候使用$result-> toArray()和$result-> isEmpty(),是会报错的。没有这个方法。

解决办法:

方法一、使用findOrEmpty()为空的时候返回的会是空模型,可以继续使用toArray() 和 isEmpty() 方法

$result = $userModel->where()->findOrEmpty() ;

方法二、用->find(),再用empty 判断

2.数据操作:链式操作

方法

作用

实例

where

查询条件

->where()

table

方法主要用于指定操作的数据表。(包含表前缀)

->table('taobao_user')

name

方法主要用于指定操作的数据表(不用写表前缀,查询时会自动使用database.php中配置好的表前缀)

->name('user')

alias

设置当前表的别名

UserModel::alias(‘u’)

field

查询字段

->field('*')

limit

限制查询数量

->limit(10) //

->limit(0,10)// 第一页

page

查询第几页(我一般少用)

->page(1,10) // 第一页

order

排序

// 单个字段

->order('create_time','desc')

// 多个字段,默认asc

->order(['create_time','user_id'=>'desc])

 

排序字段需要函数

->orderRaw()

group

分组

->group('user_id')

->group('user_id,test_time')

having

group by 的条件 :group by user_id having count(id)>2

->having('count(id)>3');

join

表连接(默认inner join)

join ( mixed join [, mixed $condition = null [, string $type = 'INNER']] )

type:关联类型。可以为:`INNER`、`LEFT`、`RIGHT`、`FULL`,不区分大小写,默认为`INNER`。

->join('user u','u.id = login.user_id and u.state >1')

leftJoin

左连接(左表为主)

->leftJoin('user u','u.id = login.user_id and u.state >1')

rightJoin

右连接(右表为主)

->leftJoin('user u','u.id = login.user_id and u.state >1')

 

join / leftJoin / rightJoin 需要连接的表也可以是个子查询

->leftJoin([$sql=>'u'],'u.id = login.user_id and u.state >1')

union

合并多个SELECT 语句的结果集。

(查询结果的的字段名称,应该一直)

Db::field('name')

->table('think_user_0')

->union('SELECT name FROM think_user_1')

->union('SELECT name FROM think_user_2')

->select();

distinct

去重

这个不经常用链式函数去写,直接field('distinct id, name')

 

lock

锁机制,在select 语句中加上 for update

->lock(true)

fetchSql

返回查询的语句

->fetchSql(true)

partition

分区

这个在tp框架中,个人比较少用。都是数据库表直接分区,比较多用hash分区, 和 值大小分区。select 直接查询没有手动切换哪个分区去查

 

where 查询

数组条件:

  • 2.1. 关联数组
  • 2.2. 索引数组

2.1 关联数组

和3.2 框架常用的条件查询基本一致,但是tp6的关联数组,只能实现and操作和=操作(起码我用的时候,不知道 != in not in like 这些的条件怎么在关联数组中使用)

$where = [ 'user_id'=>1, 'phone'=>'15600000001', 'is_delete'=>1 ]; 
$result = Db::name('user_card')->where($where)->select();

2.2 索引数组

索引数组的方式批量设置查询条件,可以使用 <> / in / not in/ like/ between 条件

$where = [
 ['id','=', 253],
 ['is_delete','>=', 1], 
 ['phone','like', '%186%'], 
 ['sex','<>', '女'],
 ['create_time','between',['2020-05-12','2022-01-11']], 
];
 $result = Db::name('user_card')->where($where)->whereNotNull('birthday')->select(); 

null 和not null 不能放在where索引数组总查询,会变成比较字符串,解决方法,用链式函数 ->whereNotNull('birthday') 或者 whereNull(birthday)

$where = [ ['birthday','=','not null'] ];
$result = Db::name('user_card')->where($where)->select();
sql:SELECT * FROM `un2co_user_card` WHERE `birthday` = 'not null'

字符串条件:

直接使用字符串条件直接查询和操作

Db::table('think_user')->whereRaw('type=1 AND status=1')->select();

Thinkphp6 的 where 查询条件 and 和 or 的 操作

tp3.2 来说 or 或者and 的操作可以在一个数组中用_logic 来解决

例一:

$where = ['id'=>1,'name'=>'小表','_logic'=>'or']

例二:

$where1 = ['id'=>1, 'name'=>'小白'];
$where2 = ['id'=>2, 'name'=>'小黑'];
$where = [$where1, $where2,'_logic'='or']

但是tp6的不行。tp6的and 和 or 可以实现的方法比较多

已知:->where(A)->where(B) 俩个条件关系是 A and B

1.多字段相同的查询条件, 可以使用 |(or) &(and)

Db::table('think_user')
->where('name|title','like','thinkphp%')
->where('create_time&update_time','>',0)
->find();

sql:

SELECT * FROM `think_user`
 WHERE ( `name` LIKE 'thinkphp%' OR `title` LIKE 'thinkphp%' )
 AND ( `create_time` > 0 AND `update_time` > 0 ) LIMIT 1

2.不同字段不同条件,包含 and 和or 的建议使用闭包查询。因为数组条件查询的达不到想要的效果(我是用不出来)。例如

SELECT * FROM `un2co_user_card`
 WHERE (nickname = '白小白' or phone = '18606995547')
 and is_delete = 1;

现有的方法,为啥不行。主要是索引数组和关联数组,条件之间都是and关系

  

where(C)->whereOR([A, B])->where(d)

A、B条件之间是或的关系,且和c是And关系,和d是or关系

where A or B

where([A, B])

where A and B. 看起来能用,但是A条件里面,无法实现or的逻辑。各个条件之间全是and逻辑。

$where = [

['id','=', 253],

['is_delete','>=', 1],

['phone','like', '%186%'],

['sex','<>', '女'],

['create_time','between',['2020-05-12','2022-01-11']],

只能用闭包查询

$where = [['nickname','=', '白小白'], ['phone','=','18606995547']];
$result = Db::name('user_card')
->where(['is_delete'=>1])
->where(function($query) use ($where){$query->whereOr($where);})
->select();

sql:

SELECT * FROM `un2co_user_card` WHERE `is_delete` = 1 AND ( `nickname` = '白小白' OR `phone` = '18606995547' )

 

### 回答1: ThinkPHP 6 中默认使用的是小写字母的表名。如果你想要将表名转换为大写字母,可以在配置文件 config/database.php 中的 'identifier_quote_character' 配置项中设置为 `"`,这样所有表名都将被转换为大写字母。 例如: ``` 'identifier_quote_character' => '"', ``` 但是强烈不建议使用大写字母命名表名,因为大多数数据库系统都是区分大小写的,容易造成命名空间的混淆,导致程序运行错误。 ### 回答2: 在ThinkPHP6中,数据库表名的转换可以通过配置文件进行设置,具体的配置项是`'db_table_name_convert'`。 首先,在`config/database.php`文件中,我们需要找到`'connections'`数组下的相应数据库连接配置项,例如`'mysql'`,然后在该配置项中加入`'db_table_name_convert'`这个配置项,如下所示: ```php 'mysql' => [ // ... 'db_table_name_convert' => true, // ... ], ``` 将`'db_table_name_convert'`设置为`true`,表示开启数据库表名转换功能。 默认情况下,ThinkPHP6会将数据库表名转换为小写字母,加上数据表前缀,并用下划线连接单词。但如果我们将`'db_table_name_convert'`设置为`true`,则可以将数据库表名转换为大写字母。 例如,有一个名为`user_info`的表,如果开启数据库表名转换功能后,它会被转换为`USER_INFO`。 总之,要将数据库表名转换为大写字母,只需要将ThinkPHP6中相应的数据库连接配置项中的`'db_table_name_convert'`设置为`true`即可。使用这种方式可以灵活控制数据库表名的大小写格式。 ### 回答3: 在ThinkPHP6中,数据库表名的转换为大写字母可以通过配置文件进行设置。具体步骤如下: 1. 打开项目目录下的`config`文件夹,找到`database.php`文件。 2. 打开`database.php`文件后,找到`'params'`数组中的`'table_name'`键,该键用于设置数据库表名的转换规则。 3. 默认情况下,`'table_name'`的值为空数组`[]`,表示不对数据库表名进行任何转换操作。可以在该数组中设置转换规则。 4. 要将数据库表名转换为大写字母,可以设置`'table_name'`的值为`['strtolower' => 'strtoupper']`。这里的`'strtolower'`和`'strtoupper'`是PHP内置的函数,分别用于将字符串转换为小写和大写。 5. 设置完成后,将`'database.php'`文件保存并关闭。 完成以上步骤后,在ThinkPHP6中使用数据库时,所有数据库表名都会被自动转换为大写字母。例如,数据库中的`user`表会被转换为`USER`。 需要注意的是,修改`database.php`配置文件后,需要重启项目才能生效。 以上就是将ThinkPHP6数据库表名转换为大写字母的方法,希望能对您有所帮助。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值