framework icon indicating copy to clipboard operation
framework copied to clipboard

使用 LIKE 模糊查询,数据库中 Null 值查询不到

Open gyjcode opened this issue 3 years ago • 12 comments

如题,使用 LIKE 模糊查询,数据库中 Null 值查询不到,Thinkphp 查询条件中如何将数据库的空值转换为空字符串以查询出来? image image image

gyjcode avatar Sep 04 '22 14:09 gyjcode

主要是关联查询中,右表没有查询到关联的数据(为 null),使用 LIKE 查询后造成的,如何将 null 转换为空字符串或者数字0?

gyjcode avatar Sep 04 '22 15:09 gyjcode

要么改数据库数据结构not null ,要么加默认值,要么查询的时候: ->whereOr([['name','like','%%'],['name','null',null]])

augushong avatar Sep 05 '22 00:09 augushong

要么改数据库数据结构not null ,要么加默认值,要么查询的时候: ->whereOr([['name','like','%%'],['name','null',null]])

数据表本身的字段已经改默认值了,这种还好。主要是有使用左连接的,因为链接不到数据,右表对应的字段都变成 null 了。这种能不能提供一个方法将右表链接的时候如果找不到对应的数据,转换下 NULL 为空字符串。这样使用 LIKE 查询的时候应该就没问题了。

gyjcode avatar Sep 05 '22 01:09 gyjcode

https://www.kancloud.cn/manual/thinkphp6_0/1037600

$users = User::withJoin('profile', 'LEFT')->select();
foreach ($users as $user) {
	echo $user->profile->name;
}

augushong avatar Sep 05 '22 02:09 augushong

https://www.kancloud.cn/manual/thinkphp6_0/1037600

$users = User::withJoin('profile', 'LEFT')->select();
foreach ($users as $user) {
	echo $user->profile->name;
}

感谢

gyjcode avatar Sep 05 '22 02:09 gyjcode

image image 麻烦再请教一下,where 与 hasWhere 是不是不能链式调用?这里生成的 SQL 语句只有最后一个 hasWhere 的内容。

gyjcode avatar Sep 05 '22 04:09 gyjcode

image image 麻烦再请教一下,where 与 hasWhere 是不是不能链式调用?这里生成的 SQL 语句只有最后一个 hasWhere 的内容。

将 where 放在 hasWhere 后会报错: image

gyjcode avatar Sep 05 '22 06:09 gyjcode

hasWhere必须静态调用(第一个)。一些复杂的关联查询,可以直接在where里加前缀,比如: ··· ->where('guanlian.ziduan','like',"%%") ···

augushong avatar Sep 05 '22 06:09 augushong

字段设定为NOT NULL DEFAULT ''这样就不会出现NULL值,数据库表结构的基本设定范式。 设定可以NULL会让查询变得很复杂

chic900709 avatar Sep 05 '22 08:09 chic900709

不好意思,我是新手。上面的文档看了。我尝试这么写但是报错了,麻烦问下有没有文档或者参考代码可以学习下的?是不是所有同名字段都要带上前缀? image

gyjcode avatar Sep 05 '22 08:09 gyjcode

是的,使用关联查询的时候,原则上都要加前缀,但实际上不用。 但是所有重复名称的字段必须要加,比如你这里的department.name,这里的报错也有可能是你的$where变量里有些name没有加前缀。

augushong avatar Sep 05 '22 08:09 augushong

是的,使用关联查询的时候,原则上都要加前缀,但实际上不用。 但是所有重复名称的字段必须要加,比如你这里的department.name,这里的报错也有可能是你的$where变量里有些name没有加前缀。

对,是这个情况,$where 中确实有 name ,感谢回复。我再想想其他较好的书写方法吧。

gyjcode avatar Sep 05 '22 08:09 gyjcode