typeorm使用distinct并有传入值时才进行where搜索


TypeOrm介绍

typeorm是一个对象关系映射模式,主要就是为了解决面向对象与关系数据库存在的互不匹配的技术。当然使用typeorm可能有时候不如直接sql语法查询,但是使用orm框架可以更容易写出高内聚低耦合的代码来,主要就是为了减少重复代码的书写。

使用distinct与where配合搜索

在一些场景中,typeorm所提供的Repository API并不能满足我们查询的需求,这时候就只有两种方案,一种是直接使用typeorm提供的query()方法直接使用sql语句来进行复杂查询,还有就是使用查询构造器Query Builder来进行查询。

当然,既然我们都用orm框架了,当然是要减少使用sql语句的场景的。

此时这就有个需求,当我们需要查询数据有多条,但我们只需要其中一条,并且他的where的值可能是不存在的,这种场景单纯使用find()是解决不了的,就需要使用Query Builder

例子:

就如这有个User表,结构为:

CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `phone` varchar(11) NOT NULL
);

这时为这张表添加三个用户,让名字和手机号各有两个为相同。

INSERT INTO `user` VALUES ('1', '张三', '12345678910');
INSERT INTO `user` VALUES ('2', '李四', '12345678910');
INSERT INTO `user` VALUES ('3', '张三', '09876543210');

此时我们要是只是想单纯查出名字叫张三的人用find()就能实现。

this.Repository.find({
    where:{name:'张三'}
})
//转换成的sql语句:SELECT * FROM user WHERE name = '张三'

此时再加一个需求,要是查询的时候没有name这个name字段并且还需要对手机号进行去重后要求返回所有数据。(这里业务可能不太清晰,主要为了实现功能…)此时可能就需要使用distinct并且来判断name字段是否为空。

很显然find()方法中没有这个distinct方法,此时就得使用Query Builder来协助我们完成这个需求。

//因为要是直接使用where({phone:xxx})来进行查询,当传入值为null的时候就会生成WHERE phone = null这样的sql语句,显然是不符合我们的需求的,就需要动态来添加

// 条件对象
const whereInfo = {};
if(phone != null){
    //如果传入的手机不为空,我们就动态为对象添加一个key 只有当phone有值的时候才会添加,否则默认全查询
    whereInfo['phone'] = phone
}

this.Repository
      .createQueryBuilder()
      .select([
        'user.phone as phone',
      ])
      .from(User, 'user') //这里的User是实体Entity的User,别名为user
      .distinct(true)//开启distinct
      .where(whereInfo)//使用where,里面传入数组
      .getRawMany();//获取数据

使用上方语句,要是没传参应该是默认会获取到:

{
    [
    	"phone":12345678910
    ],
    [
    	"phone":09876543210
    ]
}

如上两条数据,当我们传入phone参数为:12345678910时,获取到:

{
    [
    	"phone":12345678910
    ]
}

这样就完美符合我们的业务需求了,使用distinct来去除相同数据并使用where动态进行搜索。


文章作者: LsWorld
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 LsWorld !
评论
  目录