ECStore二次开发日记之7.模型获取数据方法getList的过滤条件定制研究

在第6篇开发日志《ECStore二次开发日记之5.高级 后台商品管理增加折扣虚拟字段并可以根据虚拟字段筛选折扣数据》中,可能大家对我在_filter中使用的$filter[‘filter_sql’]变量有点奇怪,可能有的童靴想知道这个是怎么来的,今天就专门来分析这个问题的,除了这个还有什么是我们可以使用的。

我们先来看app>b2c>controller>site>product.php这个文件,这个是前端商品的控制器,我们在访问http://shopex.ipodmp.com/product-100.html时访问到的数据就是由这个控制器控制的。

找到index方法处,我们会看到如下代码:

        $productsModel = $this->app->model('products');
        $goodsModel = $this->app->model('goods');

        ……

        $itemProduct = $productsModel->getList('*',array('product_id'=>$productId));

这段代码的用途是getList方法根据传入的过滤条件获取当前的商品信息噢。

是不是觉得很简单,很高端呢?

如果,我们在正常的运营中需要获取的数据是多个的怎么办?

比如只需要获取规格中的其中两个的数据呢?

你可以使用上面的getList方法获取到吗?

今天就是来讲解一下要如何根据实际情况来获取这个数据的,当然,除了用getList方法之外,另外有一个比较直接的方法就是直接调用数据库,。直接写SQL语句获取,这个不是本篇日志需要讨论的,就不多说了。

下面分析的代码在:

app > dbeav > lib > filter.php

中,有源码的朋友可以对照看。

首先,我们来看一下系统定义的几类筛选类型:

大于 than > $var
小于 lthan < $var
等于 nequal = $var
不等于 noequal <> $var
等于 tequal = $var
小于等于 sthan <= $var
大于等于 bthan >= $var
包含 has like '%$var%'
头部包含 head like '$var%'
尾部包含 foot like '%$var'
不包含 nohas not like '%$var%'
两者之间 between {field}>=$var[0] and {field}<=$var[1]
在这个范围 in in (".implode(",",(array)$var).") "
不在这个范围 notin not in (".implode(",",(array)$var).") "

有了上面定义的筛选类型,我们就可以开始编写我们的过滤条件了。

》获取没有多规格商品

要获取没有多规格的商品,就是goods表内'spec_desc'字段为null那就是没有多规格。要怎么设置这个呢?

$filter[‘spec_desc’] = null;

就可以了~然后执行getList方法,获取到的数据就是没有规格商品了。

》获取有规格的商品

查看了代码发现没有一个直接的方法,所以这个只能使用定制的SQL语句了,那么要定制SQl语句就要使用我们的超级定制变量filter_sql了:

$filter[‘filter_sql’] = ' {table}.spec_desc is not NULL ';

然后执行getList方法。

》获取商品ID为100的商品

我们知道商品的ID是用goods_id表示的,然后是100,那么就是

$filter[‘goods_id’] = 100;

执行之后就获取到了。

》获取商品ID为100,1001的商品

这个是多条件了要怎么做呢?其实,是支持数组的,然后系统会自动转换为IN语句:

$filter[‘goods_id’] = array(100,1001);

当然你也可以自定义$filter[‘filter_sql’]了,自己试试看。

》获取商品ID大于100的商品列表呢?

这个时候我们需要使用到筛选类型了。

$filter[‘goods_id|than’] = 100;

这样子就可以了,在字段的后面增加一个筛选类型,用竖线隔开。当然,你还可以使用小于,等于,大于等于等等,具体参数是上方表格内设定好的。

当然,我们还能使用下面的方式来设定,上面的语句我们可以变成下面的代码:

$filter[‘goods_id’] = 100;

$filter[‘_goods_id_search’] = 'than';

这个的使用方式的前提是需要数据库定义,否则是无效的,简单的说就是默认的字段是你一般都支持。

好了,本篇日志到此就完成了,总的其实最有用的还是$filter[‘filter_sql’]变量哈。

赶紧去试试看吧~^_^