2

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

我有以下型号:

  • 用户
  • 国家
  • 城市
  • 物品

地理层级关系为:

  • 国家有很多省
  • 省有很多城市
  • 城市有很多项目

国家和省级有很多项:'through'=>'cities'

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

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

因此,可以将用户分配到任何地理级别,并将隐含分配到该级别的所有子级别。

例如。分配到加拿大、加利福尼亚和芝加哥的用户将有权访问:

  • 加拿大所有城市所有省份的所有物品
  • 以及加州所有城市的所有物品
  • 以及芝加哥的所有物品

因此,我想查看通过用户的地理级别将哪些项目分配给用户。所以我想建立一个关系,允许我通过访问“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

1 回答 1

4

这里的问题是,您无法创建一个 SQL 语句来为您获取用户的所有不同项目,因为您在项目和用户之间的连接是不明确的:一个项目可以通过不同的路径连接到用户。这意味着,同一个项目甚至可以有多个连接到用户(例如,通过城市和通过省)。

您可以尝试为JOIN用户和项目之间的每个可能路径添加一个(通过国家、省和城市)。但是提到的歧义总是会妨碍您:您最终可能会得到一个包含重复项的结果。

而且由于在原始 SQL 中没有解决方案,你不能单独使用 Yii 关系来解决它。不过,您总是可以编写一个吸气剂:

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包含该用户所有不同项目的属性。

于 2013-04-20T17:30:08.480 回答