2013-04-07 95 views
2

我想知道如何(如果有可能)在Yii模型中组合(联合)关系。yii联合模型关系

我有以下型号:

  • 用户
  • 国家
  • 项目

地理层次结构关系是:

  • 全国有许多省份
  • 省有许多城市
  • 市有许多项目

国家及省一级有很多项目:“通过” =>“城市”

用户 - 地理关系有点复杂:

  • 用户 - 国家(多对多)
  • 用户 - 省(多对多)
  • 用户 - 市(多对多)

所以用户可以分配给任何地理区域层级,将有隐含分配给所有级别的子级别的。

例如。分配到加拿大,加利福尼亚州和芝加哥的用户,将有机会获得:在加拿大

  • 在所有城市所有城市以及所有项目

    • 所有项目在所有省份在加州
    • 以及在芝加哥的所有项目

    因此,我想看看哪些项目通过他们的地理水平分配给用户。因此,我想建立一个关系,通过访问“items”属性(例如$ myUser-> items),我可以访问分配给它们的所有项目。

    有效,我想这些组合成称为单一的关系“项目”:这里是

    'countryItems' => array(self::HAS_MANY, 'Item', array('id' => 'country_id'), 'through'=>'countries'), 
    'provinceItems' => array(self::HAS_MANY, 'Item', array('id' => 'province_id'), 'through'=>'provinces'), 
    'cityItems' => array(self::HAS_MANY, 'Item', array('id' => 'city_id'), 'through'=>'cities'), 
    
  • 回答

    4

    的问题,你不能创建得到了用户的所有不同的项目对你的SQL语句因为项目和用户之间的连接不明确:一个项目可以通过不同的路径连接到用户。这意味着,甚至可以有多个用于同一个项目的连接(例如,通过城市和省)。

    您可以尝试为用户和项目之间的所有可能路径(通过国家,省份和城市)添加JOIN。但是提到的含糊不清将总是以你的方式:你可能会得到一个包含重复的结果。

    而且由于在原始SQL中没有解决方案,所以无法单独使用Yii关系来解决它。你总是可以编写一个getter,虽然:

    public getItems() 
    { 
        $items = array(); 
    
        foreach($this->countryItems as $item) 
         $items[$item->id] = $item; 
    
        foreach($this->provinceItems as $item) 
         $items[$item->id] = $item; 
    
        foreach($this->cityItems as $item) 
         $items[$item->id] = $item; 
    
        return $items; 
    } 
    

    这有效地为您提供了包含该用户的所有不同的项$items属性。