在yii中从多对多关系中选择单个条目

时间:2014-02-01 21:04:07

标签: yii

我有以下数据库结构。实际上,它有点复杂,但我只显示相关部分。该结构是预定义的,无法更改,因为它需要与另一个DB同步。

my DB schema (simplified)

分类器可以是颜色或大小。所以基本上这个结构可以说Product Abigred,而Product Bsmallgreen

我从另一个数据库获取此数据,并且它保证每个产品每个分类器只有一个条目(即产品不能同时为redgreen)。此外,分类器ID是预定义的(例如,1color2size

如何在Product模型中建立关系,以便将分类器条目作为属性,即$product->Color$product->Size

换句话说,我该怎么做:

 SELECT * FROM product AS p
 LEFT JOIN xref_table AS x ON (p.ProductId = x.ProductId)
 LEFT JOIN classifierEntry AS classifierColor ON
   (x.ClassifierEntryId = classifierColor.ClassifierEntryId
    AND classifierColor.ClassifierId = 1)
 LEFT JOIN classifierEntry AS classifierSize ON
   (x.ClassifierEntryId = classifierSize.ClassifierEntryId
    AND classifierSize.ClassifierId = 2)

......以优雅高效的方式?

2 个答案:

答案 0 :(得分:0)

我会使用afterFind来运行自定义算法,该算法将为我填充ColorSize属性。

与关系这样做是过度的,请记住保持简单的规则。

如果您经常访问它们,可以将查找缓存到Memcache中。

答案 1 :(得分:0)

问题是你需要根据关系完全做多少。 一个选项就是 get 函数,它的行为类似于属性:

public function getColor() 
{
  $product =  .. // get the color data via SQL statement, using e.g.  Yii::app()->db->createCommand
  return $product->ClassifierName
}

public function getSize() 
{
  $product =  .. // get the size data via SQL statement, using e.g.  Yii::app()->db->createCommand
  return $product->ClassifierName
}

因为实际关系也是如此 - 他们只是选择数据并将其作为“属性”呈现给您。 您可以通过一个名为 getProperty 的函数重新定义任何属性,其行为类似于$model->property