如果参数不存在,如何使查询过滤器绑定到请求参数处于非活动状态?
例如:我有一个可以通过投影MyQuery
访问的查询MyProjection
。我在该查询中添加了一个过滤器,其中我说MyDate
字段应该等于{Request.QueryString:MyDate}
。我希望~/MyProjection?MyDate=2016-03-08
之类的网址按给定值过滤内容项,但网址~/MyProjection
只是不按该字段过滤。但事实并非如此:无论如何,条件会被添加到查询中,而且形式为[minimum DateTime value] < MyDate < [maximum DateTime value]
&#39;。这不好,因为它会过滤掉具有NULL值的字段。如果我尝试对数字字段执行相同操作,则情况会更糟,因为它会在参数不存在时抛出异常。
我知道我可以创建一个新的查询和投影来获得不同的选项,但这似乎有点过分 - 如果我想创建一个高级搜索表单,它必须针对单个投影。
是否有#34;官员&#34;这样做的方法?还是一个解决方法?或者这在Orchard中根本不受支持吗?
答案 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)。此文件夹的内容将为您提供开始创建自己所需的所有样板。只需插入自己的逻辑。