如何使查询中的过滤器可选

时间:2016-03-08 14:39:29

标签: orchardcms orchardcms-1.9

如果参数不存在,如何使查询过滤器绑定到请求参数处于非活动状态?

例如:我有一个可以通过投影MyQuery访问的查询MyProjection。我在该查询中添加了一个过滤器,其中我说MyDate字段应该等于{Request.QueryString:MyDate}。我希望~/MyProjection?MyDate=2016-03-08之类的网址按给定值过滤内容项,但网址~/MyProjection只是不按该字段过滤。但事实并非如此:无论如何,条件会被添加到查询中,而且形式为[minimum DateTime value] < MyDate < [maximum DateTime value]&#39;。这不好,因为它会过滤掉具有NULL值的字段。如果我尝试对数字字段执行相同操作,则情况会更糟,因为它会在参数不存在时抛出异常。

我知道我可以创建一个新的查询和投影来获得不同的选项,但这似乎有点过分 - 如果我想创建一个高级搜索表单,它必须针对单个投影。

是否有#34;官员&#34;这样做的方法?还是一个解决方法?或者这在Orchard中根本不受支持吗?

1 个答案:

答案 0 :(得分:1)

我不知道如何开箱即用。但是,通过实现DB::table('topics') ->leftjoin('comments', function($join) { $join->on('topics.id', '=', 'comments.topic_id'); }) ->select(DB::raw('IF(comments.id IS NULL,0, 1) as topic_comment')) ->orderBy('topic_comment', 'DESC') ->orderBy('topics.created_at', 'DESC') ->get(); the topic_comment as 1 records you can show on top right and rest wherever you want ,您可以非常轻松地创建自己的过滤器,并具有所需的行为。

看看Orchard.Projections模块。您可以在这里找到许多默认查询过滤器(包括您引用的日期字段过滤器)。如果您只需要处理特定案例,那么您的工作可能会更简单。

举一个非常简单的例子,检查Orchard.Tags模块(查看projections folder)。此文件夹的内容将为您提供开始创建自己所需的所有样板。只需插入自己的逻辑。