如图所示,分类页面左侧的过滤目前只有价格过滤,其他过滤属性并没有显示像上图那样,查文档并没有找到原因
我查了源代码,发现这块在mysql 的情况下并不好处理 如果用mongodb,就又丢弃了小而快并且简单的实际使用需求 考虑目前这样的处理方式可能说更适合大数据高并发的情况下 但是就目前情况而言,并没有这样的硬性要求, 正在考虑是彻底改掉目前这个,还是做一些简单修改满足当前所用
1.分类排序在后台设置,分类管理-->分类排序管理 , 如图:
2.源码查了,发现不好处理,请粘贴代码说明,show your code,没有代码说明你的观点,就是空谈。
3.默认mysql支持,一点问题没有,安装后没有出来,自己找原因。 去后台查看一下分类排序是否设置了(fecmall-2版本在后台设置)
4.
@Fecmall #2楼 是我描述错误了 问题是这样的 分类左侧筛选条件这里
默认mysql 下只有 price 但是实际商城运营过程中,可能需要color size 等自定义的属性分类 如果用mongodb ,运营维护成本就上去了,并不适合中小型企业
@Fecmall #2楼 非常感谢大佬能看到这个问题。 现在手上有实际运营的商城,过程中遇到一些需求和痛点,一些可以直接解决,但是一些涉及到更改低层的一些东西(数据表等),直接是可以搞定的,但是感觉不是那么流畅,和您原本的开发思路对不上,需要个方向
1.侧栏属性过滤,这个涉及到表字段,fecmall是可以在后台为产品表增加字段,而不是更改数据库
mysql实现增加字段的原理为:序列化数据,存储到某个字段,因此这种是无法进行查询的,对于mysql想实现过滤,需要用EAV模型,magento就是这样实现的,但是过于复杂,eav结构也有很多弱点,有时候某条数据的缺失就会代码致命的错误
mongodb实现增加字段的原理为:mongodb是没有表结构的,可以直接增加字段保存,增加的字段可以进行过滤查询等
2.如果mysql实现这个,你可以自己在产品表里面加字段,然后对这个字段进行过滤查询,因为每个人的这些字段不一样,因此,只能根据自己的情况,对product_flat表添加相应的字段
3.思维别那么局限,一个mongodb,就不适合中小公司了?mongodb并不难, 而且这个数据库很通用,是nosql数据库的代表(用户量上面)
多接触新事物。
/** * @param $filter_attr | String 需要进行统计的字段名称 * @propertuy $where | Array 搜索条件。这个需要些mongodb的搜索条件。 * 得到的是个属性,以及对应的个数。 * 这个功能是用于前端分类侧栏进行属性过滤。 * @return [ ['_id' => 'white', 'count' => 3], ['_id' => 'multicolor', 'count' => 6], ['_id' => 'black', 'count' => 13], ] */ public function getFrontCategoryFilter($filter_attr, $where) { if (empty($where)) { return []; } if (!isset($where['status'])) { $where['status'] = $this->getEnableStatus(); } if($filter_attr != 'color'){ if (!$this->_productModel->hasAttribute($filter_attr)) { return []; } } // where条件处理 if ($categoryId = $where['category']) { $productIds = $this->getProductIdsByCategoryId($categoryId); unset($where['category']); $arr = []; $whereArr = [ 'and', ['in', 'id', $productIds] ]; foreach ($where as $k=>$v) { if($k == 'color'){ $whereArr[] = ['like','attr_group_info',$v]; }else{ $whereArr[] = [$k =>$v]; } } $where = $whereArr; } $product_attrs = $this->_productModel->find() ->select('attr_group_info') ->where($where)->asArray() ->all(); $filter_attr_array = []; foreach ($product_attrs as $key => $value) { $product_attr = unserialize($value['attr_group_info']); if(isset($product_attr['color'])){ if(isset($filter_attr_array[$product_attr['color']])){ $filter_attr_array[$product_attr['color']] += 1; }else{ $filter_attr_array[$product_attr['color']] = 1; } } } $filter_data = []; $filter_data_one = []; foreach ($filter_attr_array as $key => $value) { $filter_data_one['_id'] = $key; $filter_data_one['count'] = $value; $filter_data[] = $filter_data_one; } //echo "<pre>"; //print_r($filter_attr_array);exit; // 总数 //$filter_data = $this->_productModel->find() // ->select($filter_attr.' as _id , COUNT(*) as count') // ->where($where) // ->groupBy($filter_attr) // ->all(); return $filter_data; }
我改了核心services/product/ProductMysqldb.php里面这一块(1095行),在牺牲性能的情况下处理了这样的查询 ,保持了不加数据表不加字段,当然,目前只针对于COLOR 这一个字段做的,根据需求或者会增加其他字段,暂时先这样处理了,大佬看如何?
@Fecmall #5楼 如楼上,另外,这边要新开模版,我新开一个贴咨询下模版相关的问题
@Fecmall #5楼 mongodb 不是难不难的问题,而是没有相应的人,我还凑合,但是后期其他人维护都不一定搞定,小公司都是一兼多职,另外服务器也需要安装,维护等等,并不是单纯的增加一个工具,其实这对我来说,都一样,最早还用txt 存过数据。。:bowtie:
哈哈哈哈哈,个人见解