Php Yii多对多对多过滤器

Php Yii多对多对多过滤器,php,mysql,yii,Php,Mysql,Yii,我对SQL比较陌生,甚至对Yii CDbCriteria的乐趣也比较陌生。以下是我想做的: 我有四门不同的课 产品 类别 产品类别 产品本地化 产品和类别通过多对多关系(由ProductHasCategory对象表示)链接。 一个产品可以有多个ProductLocalization 下面是一个场景:一个访问者在CategoryController的视图操作上着陆。该类别具有区域设置标识符(例如“en”) 我希望能够检索该类别的可用产品(到目前为止很容易),但只能检索具有“en”本地化的产品

我对SQL比较陌生,甚至对Yii CDbCriteria的乐趣也比较陌生。以下是我想做的:

我有四门不同的课

  • 产品
  • 类别
  • 产品类别
  • 产品本地化
产品和类别通过多对多关系(由ProductHasCategory对象表示)链接。 一个产品可以有多个ProductLocalization

下面是一个场景:一个访问者在CategoryController的视图操作上着陆。该类别具有区域设置标识符(例如“en”)

我希望能够检索该类别的可用产品(到目前为止很容易),但只能检索具有“en”本地化的产品

我已经能够使用极为低效的方法(例如for loops*)来实现这一点。在现实世界中实现这一点的最佳方式是什么

*编辑:根据请求,以下是我迄今为止找到的(幼稚的)解决方案:

$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);

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

嗯,是这样的吗

$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();

请注意,我不知道您的关系的名称,我需要查看您的模型文件以获得正确的结果,但我认为应该类似于此。

听起来您想要的是本地化模型上的参数化范围

首先,我要确保您可以从产品模型中提取“en”的本地化,然后从那里返回。您可能需要:

  • 产品本地化模型中的参数化范围
  • 产品模型中的参数化范围(用于确定产品->本地化模型的范围)
  • 将上述范围与类别模型中的参数一起使用

详细信息见本节底部:

请发布您迄今为止所做的尝试,我刚刚添加了当前代码。谢谢您的回答。然而,这会不会假设我有一个产品,作为一个起点,可以找到本地化?是的,但这就是正确的方式。我的意思是,
Product\u id
ProductLocalization
表中的必填字段。因此,每个地区都有相应的
产品
。我只想避免的是必须循环遍历我的类别的每一个产品,以找到该类别的产品和本地化。这不是循环。。。不过,您需要在其中添加类别关系。给我一点时间。。我将编辑答案