有条件生锈柴油过滤查询 [英] Rust diesel conditionally filter a query

查看:20
本文介绍了有条件生锈柴油过滤查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试对项目使用柴油,我希望使用";filterable";类型。其想法是您可以转到/api/foo?id=10&bar=11,它将返回一个结构Foo

struct Foo {
    id: Option<i64>,
    bar: Option<i64>,
    name: Option<String>,
}

如:

Foo {
   id: Some(10),
   bar: Some(11),
   name: None,
}

我一直在网上搜索,想找一条通过现有字段去过滤的路,但就是找不到一个可行的解决方案。我最初使用mysql driver并使用proc宏构造SQL查询,但DIESEL使用起来要好得多,我想知道是否有办法获得与使用DIESEL的MySQL驱动程序相同的行为。

推荐答案

可以使用into_boxed方法,该方法:

将查询的各个部分装箱为单一类型。 如果您希望有条件地修改查询,但需要保持类型不变,这将非常有用。装箱的查询将导致较小的性能损失,因为编译器不能再内联查询生成器。对于大多数应用程序,此成本最低。

use crate::schema::foo;

let mut query = foo::table.into_boxed();

if let Some(id) = foo.id {
    query = query.filter(foo::id.eq(id));
}

if let Some(bar) = foo.bar {
    query = query.filter(foo::bar.eq(bar));
}

if let Some(name) = foo.name {
    query = query.filter(foo::name.eq(name));
}

let results = query
    .load::<Foo>(&conn)
    .expect("error loading foo");

这篇关于有条件生锈柴油过滤查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆