簡體   English   中英

PHP PDO fetchAll,PDO :: FETCH_CLASS和join

[英]PHP PDO fetchAll, PDO::FETCH_CLASS and joins

我在以下代碼中遇到問題:

$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語句。 當你有一個join語句時,它將獲取一個類中的所有內容。 換一種說法:

$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 -

我怎樣才能做到這一點?

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

最簡單的答案是你必須編寫自己的代碼。 將行作為數組獲取並使用它填充類,因為它始終是完成的;-)

您描述的技術是ORM( 對象關系映射 )。 有一些第三方庫實現它,例如DoctrinePropel

我開源了一個非常小的函數,它將聯接的結果轉換為層次結構。 如果您只需要這個小功能,這可以避免使用繁重的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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM