2013-04-07 5 views
2

Я хотел бы знать, как (если это возможно) объединить (объединить) отношения в модели Yii.yii Комбинирование модели связи

У меня есть следующие модели:

  • пользователя
  • Страна
  • Область
  • Город

Отношения географическая иерархия Деталь:

  • Страна имеет много провинций
  • провинция имеет много городов
  • Город имеет много Items

Страна и уровень провинции имеет много элементов: «через» => 'городов

Юзернейм -ографические отношения несколько сложнее:

  • Пользователь - Страна (многие для многих)
  • пользователь - Область (многие ко многим)
  • пользователь - Город (многие ко многим)

Таким образом, пользователь может быть назначена на любой уровень географического и подразумевал назначение на все дочерних уровнях, что уровень в ,

например. Пользователь назначен в Канаде, Калифорнии и Чикаго, будет иметь доступ к:

  • Все объекты во всех провинциях во всех городах Канады
  • , а также всех элементов во всех городах в Калифорнии
  • , а также все товары в Чикаго

Как таковой, я хотел бы видеть, какие элементы назначаются пользователю через их географические уровни. Поэтому я хотел бы установить отношение, которое позволит мне получить доступ ко всем элементам, назначенным им, просто путем доступа к свойству «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. Вы всегда можете написать геттер, хотя:

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 свойство, которое содержит все различные элементы для этого пользователя.

Смежные вопросы