2011-11-08 65 views
3

我有下面的代碼有問題:PHP PDO使用fetchall,PDO :: FETCH_CLASS並加入

$query = 'SELECT user.id as id, pet.name as name FROM user 
      LEFT JOIN pet on pet.user_id = user.id 
      WHERE user.id = 15'; 

$result = $pdo->query($query); 

此代碼將產生類似這樣:

*************** 
| id | name | 
*************** 
| 1 | Mikey | 
*************** 
| 1 | Stewie | 
*************** 
| 1 | Jessy | 
*************** 

現在,我喜歡使用PDO::FETCH_CLASS來獲取對象。但是,至少對我而言,這種方法只適用於簡單的SELECT聲明。當你有一個連接語句時,它會在一個類中獲取所有內容。換句話說:

$user = $result->fetchAll(PDO::FETCH_CLASS, 'User'); 
echo $user->name; // this will print the pet name (which is weird) 

因此,我想有類似的東西:

$pets = $user->pets; // an array holding Pet Objects 
foreach ($pets as $pet) 
    echo $pet->name . "-"; 

這將產生:

Mikey - Stewie - Jessy - 

我怎樣才能做到這一點?

回答

6

你不能依靠PDO爲你完成這項工作。 PDO無法知道數據集列的來源,它顯然無法確定您想要轉儲數據的位置。

最簡單的答案是你必須編寫自己的代碼。將行作爲數組提取並填充類,因爲它總是完成;-)

您描述的技術是ORM(Object-relational mapping)。有一些第三方庫實現它,如DoctrinePropel

0

我打開一個非常小的函數,它會將連接的結果轉換爲層次結構。這樣可以避免使用繁重的ORM,如果您只需要這個小功能。 https://github.com/afilina/nestedsql

你想給它一個說法是這樣的:

SELECT album.id AS albums__id, photo.id AS albums__photos__id 
FROM album 
LEFT JOIN photo ON photo.album_id = album.id; 

,它會產生一種這樣的:

stdClass Object 
(
    [albums] => Array 
     (
      [1] => stdClass Object 
       (
        [id] => 1 
        [photos] => Array 
         (
          [1] => stdClass Object 
           (
            [id] => 1 
           ) 
         ) 
       ) 
     ) 
) 

或者,你可以通過你自己的類取代stdClass的。