У меня есть эти две таблицы базы данных:
местоположения
идентификатор
имя
пользователи
id
location_id
last_name
first_name
У меня также есть классы User и Location, они оба расширяют Model и содержат некоторые пользовательские методы. Например, в классе User есть метод get_full_name().
Я использую следующие коды для загрузки данных,
$this->db->select('users.id, locations.name as location_name, users.last_name, users.first_name');
$this->db->from('users');
$this->db->join('locations', 'users.location_id = location.id');
$query = $this->db->get();
$users= $query->custom_result_object('User'); //now $users is an array of User object
custom_result_object — это встроенная, но недокументированная функция в Codeigniter. Он принимает строку имени класса и будет использовать ее для создания объектов этого класса.
С помощью приведенных выше кодов я могу получить доступ к данным следующим образом:
foreach($users as $user)
{
echo $user->id;
echo $user->get_full_name();
echo $user->location_name;
}
Но, как видите, location_name теперь является полем объекта User, а я хочу, чтобы объект User имел поле объекта Location. что позволяет мне использовать его вот так,
foreach($users as $user)
{
echo $user->id;
echo $user->get_full_name();
echo $user->location->name; // Location is an object
}
Я не хочу использовать DataMapper ORM или любые другие ORM, а также хотел бы избежать проблем с производительностью запросов N+1.
Как это сделать с минимальным количеством кодов?
Примечание. Я создал этот пример только для демонстрационных целей, в моем реальном случае существует довольно много таблиц и классов (для которых определены пользовательские методы).
Большое спасибо всем вам.