2010-10-10 4 views
3

Je suis novice en PHP orienté objet, mais j'ai réussi à comprendre la plupart des choses jusqu'à maintenant. Je construis un site Web où les utilisateurs peuvent créer un compte et ajouter, disons, des passe-temps à leur profil. J'ai réussi à comprendre la création de la classe, l'objet, le stockage d'un seul utilisateur dans la base de données et la récupération d'un seul utilisateur de la base de données - créer un nouvel objet à partir du tableau associatif renvoyé par le SQL "requête.OOPHP - Comment créer plusieurs objets à partir d'un tableau de lignes de base de données?

Où je suis maintenant coincé est quand j'en ai besoin pour retourner plusieurs lignes (enregistrements) de la base de données. Par exemple, un utilisateur peut avoir 7 hobbies; la requête SQL retourne toutes les 7 lignes dans un tableau associatif (avec des champs, par exemple, hobby_id, hobby_name, hobby_created), mais comment puis-je faire de chacun de ces enregistrements de lignes/passe-temps dans son propre objet?

J'ai essayé de chercher toutes sortes de termes, mais je ne sais pas si je manque juste le mot à la mode que j'ai besoin de chercher. Si quelqu'un pouvait me faire savoir la meilleure façon d'y parvenir, je serais éternellement reconnaissant.

Un grand merci, Steve

+0

Merci à tous pour vos réponses - cela m'a fait réaliser que je peux probablement créer un tableau d'objets pour répondre à l'exigence, je ne pensais pas de cette façon auparavant. Je n'ai pas encore utilisé d'AOP et je ne veux pas y entrer pour l'instant (car je suis encore en train de me familiariser avec OO). J'ai déjà créé la classe pour "hobby" et fait tout le __construct, __get, __set etc. - J'ai fait une page qui permet à l'utilisateur d'ajouter un hobby un par un ... J'avais juste besoin de savoir comment alors pour récupérer tous les hobbies à afficher sur la page de profil utilisateur. Merci encore tout le monde! :) – SirMalius

Répondre

1

Lorsque vous avez un ensemble de passe-temps, créez les objets de passe-temps dans une foreach.

$hobby = Array(); 
foreach ($query->results as $row) 
    $hobby = new Hobby($row['person_id'], $row['hobby']... 

ou peut-être un hachage d'objets.

+0

Merci, je pense que je vais essayer celui-ci et voir comment je m'entends. – SirMalius

+0

Question rapide - le code ci-dessus ne finira-t-il pas avec $ hobby étant un objet dérivé de la dernière rangée du tableau? Sûrement, il va continuer à itérer et à écraser $ hobby avec l'objet suivant? Ou fait le "Array()"? la syntaxe fait-elle comprendre à PHP que chaque nouvel objet Hobby est ajouté au tableau plutôt que de le remplacer? – SirMalius

+0

Je crois qu'il a besoin de pousser ajouté. – johnny

0

Tout d'abord, vous auriez réellement créer un objet pour gérer ces passe-temps. Vous ne pouvez pas simplement saupoudrer Acme OOP sauce sur certaines données et le faire par magie se transformer en un objet. Un objet est à la fois des données et des fonctions (méthodes, en fait) pour travailler avec ces données. Alors, commencez par comprendre ce que vous voulez que votre code fasse avec ces bits de données hobbie et travaillez à partir de là.

0

Y a-t-il une raison pour laquelle les hobbies doivent être son propre objet? Il semble que cela fonctionne bien comme un hachage/tableau. Si vous voulez vraiment créer un objet, vous pouvez créer une classe de passe-temps qui stocke le nom du passe-temps/date de création et qui a des getters pour eux. Y a-t-il d'autres données à associer au passe-temps, ou des calculs à faire? Si c'est le cas, vous pouvez créer des méthodes de la classe Hobby pour le faire pour vous.

3

Vous pouvez boucle à travers le résultat et créer des passe-temps à partir des données ou si vous utilisez PDO vous pouvez utiliser:

$stmt->fetchAll(PDO::FETCH_CLASS, 'Hobby'); 

Cela va créer une classe Hobby pour chaque ligne et remplir les propriétés avec les colonnes de la requête.

De http://www.php.net/manual/en/pdostatement.fetch.php

PDO :: FETCH_CLASS: retourne une nouvelle instance de la classe demandée, les colonnes du résultat mis aux propriétés nommées dans la classe. Si fetch_style comprend PDO :: FETCH_CLASSTYPE (par exemple PDO :: FETCH_CLASS | PDO :: FETCH_CLASSTYPE), le nom de la classe est déterminée à partir d'une valeur de la première colonne.

Remarque: si vous utilisez fetch() et non fetchAll(), vous devez utiliser setFetchMode() avant d'appeler chercher()

$stmt->setFetchMode(PDO::FETCH_CLASS, 'Hobby'); 
0

Vous pouvez facilement cataloguée un tableau associatif pour objet avec propriétés, comme:

// $obj is instance of stdClass 
$obj = (object)array('hobby_name'=>'name'); 

Bien sûr, la question n'a pas été clairement que pour ce dont vous avez besoin des objets, ou si elles doivent être d'une classe explicite (@ réponse de Galean).

Questions connexes