不确定数量级别的对象属性

时间:2010-01-14 13:14:49

标签: php oop orm kohana

这个问题与this one类似,但(从字面上看)将其提升到另一个级别或级别。

背景:我使用的是Kohana PHP framework,特别是ORM library

基本上,当您使用它循环DB结果时,您可以将字段值作为对象的属性进行访问。可以以分层方式访问任何连接表。例如:

$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 :(得分:0)

好的,我已经破解了这个。

我写了这样的函数:

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));
    }
}

上帝保佑递归。

答案 1 :(得分:0)

试试这个:

$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的作用(取自Kohana的文档):

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

编辑:

以上解决方案适用于Kohana v3。 对于Kohana 2.3.4,请参阅this page上的第三篇文章。