2010-01-14 39 views
0

此问题与this one类似,但是(字面上)将其带到另一个级别或级别。不确定层数的对象属性

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

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

$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>"; 
} 

这是可能的一些简单的方式,我失踪了?

非常感谢!

回答

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上的第三篇文章。

+0

对不起,我应该指定我使用Kohana 2.3.4 - 这个功能似乎只Kohana 3。 这就是说,这是一个很好的解决方案,如果我使用Kohana 3,我肯定会使用它。 – 2010-01-15 18:51:22

+0

好吧,我编辑了答案来澄清这一点。 – dusan 2010-01-15 19:27:35

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

上帝保佑递归。

+0

如果有人有比这更好的答案,我会很乐意接受它。 – 2010-01-14 15:36:34

相关问题