Свойства объекта для неопределенного количества уровней - PullRequest
0 голосов
/ 14 января 2010

Этот вопрос похож на этот , но (буквально) переносит его на другой уровень или уровни.

Справочная информация. Я использую PHP-структуру Kohana и, в частности, библиотеку ORM .

По сути, когда вы просматриваете результаты БД с ним, вы можете получить доступ к значениям поля в качестве свойств объекта. Любые объединенные таблицы могут быть доступны в иерархическом порядке. Например:

$users = ORM::factory('user')->with('city')->with('city:country')->find_all();
foreach ($users as $user) {
    echo "<p>{$user->name} ({$user->city->name}, {$user->city->country->name})</p>";
}

выведет:

Пользователь 1 (Город 1, Страна 1)

Пользователь 2 (Город 2, Страна 1)

Пользователь 3 (Город 2, Страна 1)

Пользователь 4 (Город 3, Страна 2)

Пользователь 5 (Город 4, Страна 2)

и т.д.

Теперь мой вопрос: есть ли способ получить доступ к иерархическим свойствам объекта для любого количества уровней. В идеале я хотел бы сделать что-то вроде этого:

$users = ORM::factory('user')->with('city')->with('city:country')->find_all();
$var2 = 'name';
$var2 = 'city->name';
$var3 = 'city->country->name';
foreach ($users as $user) {
    echo "<p>" . $user->{$var1} . "(" . $user->{$var2} . ", " . $user->{$var3} . ")</p>";
}

Возможно ли это каким-то простым способом, которого мне не хватает?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 15 января 2010

Попробуйте это:

$users = ORM::factory('user')->with('city')->with('city:country')->find_all();
$var1 = 'name';
$var2 = 'city.name';
$var3 = 'city.country.name';
foreach ($users as $user) {
    $user = $user->as_array();
    echo "<p>" . Arr::path($user, $var1)  . "(" . Arr::path($user, $var2) . ", " . Arr::path($user, $var3) . ")</p>";
}

Чтобы понять, что делает Arr:path (взято из документации Коханы):

// Get the value of $array['foo']['bar']
$value = Arr::path($array, 'foo.bar');

EDIT:

Приведенное выше решение относится к Kohana v3. Для Kohana 2.3.4 см. Третий пост на этой странице .

0 голосов
/ 14 января 2010

ОК, я взломал это.

Я написал такую ​​функцию:

public static function get_attribute($object, $level)
{
    $level = explode('->', $level);
    if (count($level) == 1) {
        return $object->{$level[0]};
    } else {
        $object = $object->{$level[0]};
        unset($level[0]);
        return self::get_attribute($object, implode('->', $level));
    }
}

Да благословит Бог рекурсию.

...