1.如果使用active recode 的方式,我没有找到可以一次查询的方式,原因如下:
1.1 AR方式,因为需要得到对象的各个attributes
,对应到数据库表的各个字段,对于mysql的AR是先查询表结构,然后得到各个attributes
,然后在进行下一步的查询,对于mongodb是没有表结构的,所以只能在AR里面通过方法定义,譬如:
@fecshop/models/mongodb/Product.php方法中的 public function attributes()
方法。
1.2 对于产品数据,引入了属性组的概念,不同的属性组对应的属性不同,因此,对于attributes()
方法,是由两部分组成,默认定义的属性和动态引入的属性合并起来。也就是
Yii::$service->product->addGroupAttrs($attr_group);
执行后会设置$_customProductAttrs
,进而将属性添加到AR中,代码如下:
/**
* mongodb是没有表结构的,因此不能像mysql那样取出来表结构的字段作为model的属性
* 因此,需要自己定义model的属性,下面的方法就是这个作用
*/
public function attributes()
{
$origin = [
'_id',
'name',
'spu',
'sku',
'weight',
'score',
'status',
'qty',
'min_sales_qty',
'is_in_stock',
'visibility',
'url_key',
//'url_path',
'category',
'price',
'cost_price',
'special_price',
'special_from',
'special_to',
'tier_price',
'final_price', // 算出来的最终价格。这个通过脚本赋值。
'new_product_from',
'new_product_to',
'freeshipping',
'featured',
'upc',
'meta_title',
'meta_keywords',
'meta_description',
'image',
'sell_7_count',
'sell_30_count',
'sell_90_count',
'description',
'short_description',
'custom_option',
'remark',
'created_at',
'updated_at',
'created_user_id',
'attr_group',
'reviw_rate_star_average', //评论平均评分
'review_count', //评论总数
'reviw_rate_star_average_lang', //(语言)评论平均评分
'review_count_lang', //(语言)评论总数
'favorite_count', // 产品被收藏的次数。
'relation_sku', // 相关产品
'buy_also_buy_sku', // 买了的还买了什么
'see_also_see_sku', // 看了的还看了什么
];
if (is_array(self::$_customProductAttrs) && !empty(self::$_customProductAttrs)) {
$origin = array_merge($origin, self::$_customProductAttrs);
}
return $origin;
}
因此对于使用AR的方式,我没有找到省略一次查询的方法,因为必须先经过第一次查询得到属性组,
2.如果不使用AR,是可以的,直接查出来就行,但是AR的很多便利性就不能用了。
3.mongodb的并发查询非常优秀,按照主键查2次并不会带来太大的问题,最后折中的方案,就是您上面贴的代码,消耗一次查询带来开发的遍历性
4.产品页面,分类页面,一般要做整页缓存,动态数据用ajax加载,因此产品页面的两次查询的次数又被削弱
最后,如果您找到好的方式,就贴一下代码,一起学习