2010-01-14 73 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

相關問題