Yii 组合模型关系

Yii 组合模型关系,yii,relationship,Yii,Relationship,我想知道如何(如果可能的话)在Yii模型中组合(联合)关系 我有以下型号: 使用者 国家 省 城市 项目 地理层次关系是: 这个国家有许多省份 这个省有许多城市 这个城市有很多东西 国家和省级有许多项目:“通过”=>“城市” 用户地理关系要复杂一些: 用户-国家/地区(多对多) 用户-省(多对多) 用户-城市(多对多) 因此,用户可以被分配到任何地理级别,并将隐含分配到该级别的所有子级别 例如,分配到加拿大、加利福尼亚和芝加哥的用户将有权访问: 加拿大所有城市所有省份的所有项目 以

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

我有以下型号:

  • 使用者
  • 国家
  • 城市
  • 项目
地理层次关系是:

  • 这个国家有许多省份
  • 这个省有许多城市
  • 这个城市有很多东西
国家和省级有许多项目:“通过”=>“城市”

用户地理关系要复杂一些:

  • 用户-国家/地区(多对多)
  • 用户-省(多对多)
  • 用户-城市(多对多)
因此,用户可以被分配到任何地理级别,并将隐含分配到该级别的所有子级别

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

  • 加拿大所有城市所有省份的所有项目
  • 以及加州所有城市的所有商品
  • 还有芝加哥的所有商品
因此,我希望看到哪些项目是通过其地理级别分配给用户的。因此,我想建立一个关系,允许我通过访问“items”属性(例如$myUser->items)来访问分配给它们的所有项目

实际上,我想将这些组合成一个称为“项目”的单一关系:


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

您可以尝试为用户和项目之间的每个可能路径(通过国家、省和市)添加一个
连接。但是提到的模棱两可总是挡在你的路上:你最终可能会得到一个包含重复项的结果

由于原始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
属性,该属性包含该用户的所有不同项。

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

您可以尝试为用户和项目之间的每个可能路径(通过国家、省和市)添加一个
连接。但是提到的模棱两可总是挡在你的路上:你最终可能会得到一个包含重复项的结果

由于原始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
属性,该属性包含该用户的所有不同项