我对SQL比较新,甚至更新Yii CDbCriteria的乐趣。这就是我要做的事情:
我有四个不同的班级
产品和类别由多对多关系链接(由ProductHasCategory对象表示)。 产品可以有多个ProductLocalization。
以下是该场景:访问者登陆CategoryController的视图操作。该类别具有区域设置标识符(例如' en')。
我希望能够检索适用于该类别的产品(目前为止很容易),但只能使用' en'定位。
我已经能够使用极其低效的方式(例如for循环*)来实现这一目标。在现实世界中实现这一目标的最佳方法是什么?
*编辑:根据要求,这是我到目前为止找到的(天真)解决方案:
$productWithAppropriateLocalization = array();
foreach ($category->products as $product){
$locale_product = ProductLocalization::model()->find("product_id = :product_id AND locale = :locale", array(":product_id"=>$product->id, ":locale"=>$category->locale));
$productWithAppropriateLocalization[] = $locale_product;
}
$localizedProductsDataProvider = CArrayDataProvider($productWithAppropriateLocalization);
显然,这既不优雅也不优化;除非我大量缓存结果。
答案 0 :(得分:0)
嗯这样的事情?
$params['someLocale'] = 'en';
$params['someCategoryId'] = 11;
$params['someId'] = 3; //This is obviously an example, set $params to whatever you need
$condition = 't.Product_id=:someId AND t.locale=:someLocale AND Product.ProductHasCategory.Category.id =:someCategoryId';
$productLocalization = ProductLocalization::model()->with('Product','Product.ProductHasCategory','Product.ProductHasCategory.Category')->find(array('condition'=>$condition, 'params'=>$params));
我不是100%肯定我在条件中解决类别关系的方式,但如果有什么让我知道
然后,您可以使用...
获取相关模型$product = $productLocalization->getRelated('Product')->getAttributes();
请注意我不知道您的关系的名称,我需要查看您的模型文件才能做到这一点,但我认为应该是类似的。
答案 1 :(得分:0)
听起来就像是本地化模型中的参数化范围。
首先,我要确保您只需提取本地化内容即可获得' en'从产品型号开始,从那里开始工作。您可能需要:
详细信息位于此部分的底部:http://www.yiiframework.com/doc/guide/1.1/en/database.arr#relational-query-with-named-scopes