Yii多对多到多个过滤器

时间:2014-04-01 19:26:08

标签: php mysql yii

我对SQL比较新,甚至更新Yii CDbCriteria的乐趣。这就是我要做的事情:

我有四个不同的班级

  • 产品
  • 分类
  • ProductHasCategory
  • 产品的定位

产品和类别由多对多关系链接(由ProductHasCategory对象表示)。 产品可以有多个ProductLocalization。

Class representation

以下是该场景:访问者登陆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);

显然,这既不优雅也不优化;除非我大量缓存结果。

2 个答案:

答案 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