这个问题与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>";
}
这是否可能以某种简单的方式丢失?
非常感谢!
答案 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上的第三篇文章。