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.
Я чувствую, что упускаю что-то очень очевидное, но я не могу понять, что это такое. Пожалуйста, помогите мне.
1 ответ
Он признает городской собственности в регионе
Так как $country->regions
возвращает объект ORM с подготовленными операторами WHERE, а не список регионов. Если вы позвоните $country->regions->find_all()
, вы получите массив регионов, но после этого вы сможете получить доступ к своим городам только через foreach
петля.
Есть простой способ, я думаю. Просто добавьте country_id
поле для модели города и определить отношение Belong_To. Таким образом, вы сможете использовать $country->cities
или же $city->country
без загрузки регионов.