framework
framework copied to clipboard
where数组条件含NULL、NOT NULL时错误。
发现一个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。这个有点画蛇添足,应该直接不需要传递该参数。
在文档哪部分看到第一种用法的,我查一下。
其实tp6的where数组用法就两种,第一是一维索引数组,第二是二维数组这种。
一维数组索引就是这样:
[
'name' => 'thinkphp',
'status'=> 1
]
二维数组的这样:
[
['name','=','thinkphp'],
['status','=',1]
]
可以通过两次where设置一起使用。
在文档哪部分看到第一种用法的,我查一下。
其实tp6的where数组用法就两种,第一是一维索引数组,第二是二维数组这种。
一维数组索引就是这样:
[ 'name' => 'thinkphp', 'status'=> 1 ]
二维数组的这样:
[ ['name','=','thinkphp'], ['status','=',1] ]
可以通过两次where设置一起使用。
那不得逼死处女座?一次where条件可以搞定的事情没必要用两次where的。
并不是。 这里的理念最好是:能用多次where搞定的,不要试图用一个where搞定。 即便是使用一个where的时候,那么数组格式也一定要是统一的,而不应该是两种方式同时传入,否则显得更乱。
当然,is null和not null 的写法的问题,可以深究到mysql的哲学理念,有一些人经常喷mysql 的这一点。他们认为,= null 才是正确有效的写法。这里不展开了。
我认为这种“问题”,不太能得到官方得修改,这会让where变得更复杂。
并不是。 这里的理念最好是:能用多次where搞定的,不要试图用一个where搞定。 即便是使用一个where的时候,那么数组格式也一定要是统一的,而不应该是两种方式同时传入,否则显得更乱。
当然,is null和not null 的写法的问题,可以深究到mysql的哲学理念,有一些人经常喷mysql 的这一点。他们认为,= null 才是正确有效的写法。这里不展开了。
我认为这种“问题”,不太能得到官方得修改,这会让where变得更复杂。
这个例子使用的格式是一致的,只不过是第三个参数null有点多余了,和MySQL的语法无关。
恩,我的意思就是,如果用二维数组的方式,内部数组就要满足三个元素。
这样写试试:
[
['field','=','null],
['field','=','not null],
]
我是处女座- -,不建议修改where,现在用着很爽,想怎么写都可以。一维的统一在一个where里,二维的在一个where里,这样不更清晰吗
满足三个其实不应该是多余的,我是完全不使用一维、二维数组来进行查询的,那如果我接手到这份代码,可能我会理解成 code = 'NOT NULL'
而不是 code IS NOT NULL
,=
的等级会较高。