2011-11-08 19 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ステートメントでのみ正常に動作します。 joinステートメントを使用すると、すべてのものを1つのクラスにフェッチします。言い換えれば、生成されます

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

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

したがって、私は似たものを持ってしたいと思います

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を置き換えることができます。

関連する問題