framework icon indicating copy to clipboard operation
framework copied to clipboard

where数组条件含NULL、NOT NULL时错误。

Open fizechan opened this issue 2 years ago • 7 comments

发现一个BUG:

数组条件查询时,NULL、NOT NULL的写法和文档不一致,如下:

->where([ ['project_id', '=', $project_id], ['category', '=', $category], ['code', 'NOT NULL'], ['efq_code', 'NULL'], ['materials_type', '=', $materials_type], ['is_delete', '=', $is_delete] ])

会报错,需要修改为:

->where([ ['project_id', '=', $project_id], ['category', '=', $category], ['code', 'NOT NULL', null], ['efq_code', 'NULL', null], ['materials_type', '=', $materials_type], ['is_delete', '=', $is_delete] ])

即NULL、NOT NULL条件需要添加第三个参数null。这个有点画蛇添足,应该直接不需要传递该参数。

fizechan avatar Sep 01 '22 06:09 fizechan

在文档哪部分看到第一种用法的,我查一下。

其实tp6的where数组用法就两种,第一是一维索引数组,第二是二维数组这种。

一维数组索引就是这样:

[
	'name'	=>	'thinkphp',
        'status'=>	1
]

二维数组的这样:

[
	['name','=','thinkphp'],
        ['status','=',1]
]

可以通过两次where设置一起使用。

augushong avatar Sep 01 '22 06:09 augushong

在文档哪部分看到第一种用法的,我查一下。

其实tp6的where数组用法就两种,第一是一维索引数组,第二是二维数组这种。

一维数组索引就是这样:

[
	'name'	=>	'thinkphp',
        'status'=>	1
]

二维数组的这样:

[
	['name','=','thinkphp'],
        ['status','=',1]
]

可以通过两次where设置一起使用。

那不得逼死处女座?一次where条件可以搞定的事情没必要用两次where的。

fizechan avatar Sep 15 '22 03:09 fizechan

并不是。 这里的理念最好是:能用多次where搞定的,不要试图用一个where搞定。 即便是使用一个where的时候,那么数组格式也一定要是统一的,而不应该是两种方式同时传入,否则显得更乱。

当然,is null和not null 的写法的问题,可以深究到mysql的哲学理念,有一些人经常喷mysql 的这一点。他们认为,= null 才是正确有效的写法。这里不展开了。

我认为这种“问题”,不太能得到官方得修改,这会让where变得更复杂。

augushong avatar Sep 15 '22 13:09 augushong

并不是。 这里的理念最好是:能用多次where搞定的,不要试图用一个where搞定。 即便是使用一个where的时候,那么数组格式也一定要是统一的,而不应该是两种方式同时传入,否则显得更乱。

当然,is null和not null 的写法的问题,可以深究到mysql的哲学理念,有一些人经常喷mysql 的这一点。他们认为,= null 才是正确有效的写法。这里不展开了。

我认为这种“问题”,不太能得到官方得修改,这会让where变得更复杂。

这个例子使用的格式是一致的,只不过是第三个参数null有点多余了,和MySQL的语法无关。

fizechan avatar Sep 19 '22 06:09 fizechan

恩,我的意思就是,如果用二维数组的方式,内部数组就要满足三个元素。

这样写试试:

[
    ['field','=','null],
    ['field','=','not null],
]

augushong avatar Sep 19 '22 06:09 augushong

我是处女座- -,不建议修改where,现在用着很爽,想怎么写都可以。一维的统一在一个where里,二维的在一个where里,这样不更清晰吗

yuyachong avatar Oct 02 '22 05:10 yuyachong

满足三个其实不应该是多余的,我是完全不使用一维、二维数组来进行查询的,那如果我接手到这份代码,可能我会理解成 code = 'NOT NULL' 而不是 code IS NOT NULL= 的等级会较高。

hongfs avatar Oct 02 '22 13:10 hongfs