Kohana 3.1 ORM: попытка построить последующие отношения «один ко многим»

У меня есть структура таблицы MySQL, которая выглядит так:

Страны -> Страны_Регионы (FK: country_id) -> Страны_Регионы_Города (FK: region_id)

Таким образом, между страной и регионом существует связь «один ко многим», а между регионом и городом существует связь «один ко многим».

Я попытался связать их со следующими классами:

class Model_Country extends ORM {
    protected $_has_many = array('regions' => array("model" => "Countries_Region"));
}

class Model_Countries_Region extends ORM {
    protected $_has_many = array('cities' => array("model" => "Countries_Regions_City"));
    protected $_belongs_to = array('country' => array("model" => "Country"));
}

class Model_Countries_Regions_City extends ORM {
    protected $_belongs_to = array('region' => array("model" => "Countries_Region"));
}

Все пойдет нормально, если я попытаюсь найти все регионы с

$country = ORM::factory("country", 1);
$region = $country->regions->find_all();

Но когда я пытаюсь найти все города снизу вверх, с

$country = ORM::factory("country", 1);
$city = $country->regions->cities->find_all();

Он распознает свойство города в регионе, но возвращает пустую строку со всеми значениями города, установленными в NULL.

Я чувствую, что упускаю что-то очень очевидное, но я не могу понять, что это такое. Пожалуйста помогите.


person Plankje    schedule 26.07.2011    source источник


Ответы (1)


Он признает городскую собственность в регионе

Потому что $country->regions возвращает объект ORM с подготовленными операторами WHERE, а не списком регионов. Если вы вызовете $country->regions->find_all(), вы получите массив регионов, но после этого вы сможете получить доступ к их городам только через цикл foreach.

Думаю, есть простой способ. Просто добавьте поле country_id в модель City и определите отношение Belong_To. Таким образом, вы сможете использовать $country->cities или $city->country без загрузки регионов.

person biakaveron    schedule 26.07.2011
comment
Отличный ответ, большое спасибо! Наконец, теперь он работает правильно. - person Plankje; 26.07.2011